[llvm] [SHT_LLVM_BB_ADDR_MAP] Adds pretty printing of BFI and BPI for PGO Analysis Map in tools. (PR #82292)
Micah Weston via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 21 17:42:23 PST 2024
https://github.com/red1bluelost updated https://github.com/llvm/llvm-project/pull/82292
>From e81270d9f2bd406620fc28fca706535c0195cf00 Mon Sep 17 00:00:00 2001
From: Micah Weston <micahsweston at gmail.com>
Date: Thu, 7 Dec 2023 09:55:00 -0500
Subject: [PATCH 1/7] [BlockFrequency] Moves the block printing function to
support to use without depending on Analysis.
---
.../llvm/Analysis/BlockFrequencyInfoImpl.h | 3 ---
llvm/include/llvm/Support/BlockFrequency.h | 4 ++++
llvm/lib/Analysis/BlockFrequencyInfo.cpp | 2 +-
llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp | 15 ---------------
llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp | 2 +-
llvm/lib/Support/BlockFrequency.cpp | 18 ++++++++++++++++++
6 files changed, 24 insertions(+), 20 deletions(-)
diff --git a/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h b/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
index 8acb75e8725410..4aa922635c374e 100644
--- a/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
+++ b/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
@@ -539,9 +539,6 @@ class BlockFrequencyInfoImplBase {
}
};
-void printBlockFreqImpl(raw_ostream &OS, BlockFrequency EntryFreq,
- BlockFrequency Freq);
-
namespace bfi_detail {
template <class BlockT> struct TypeMap {};
diff --git a/llvm/include/llvm/Support/BlockFrequency.h b/llvm/include/llvm/Support/BlockFrequency.h
index 8b172ee486aab8..aeab99615a951a 100644
--- a/llvm/include/llvm/Support/BlockFrequency.h
+++ b/llvm/include/llvm/Support/BlockFrequency.h
@@ -19,6 +19,7 @@
namespace llvm {
+class raw_ostream;
class BranchProbability;
// This class represents Block Frequency as a 64-bit value.
@@ -119,6 +120,9 @@ class BlockFrequency {
}
};
+void printRelativeBlockFreq(raw_ostream &OS, BlockFrequency EntryFreq,
+ BlockFrequency Freq);
+
} // namespace llvm
#endif
diff --git a/llvm/lib/Analysis/BlockFrequencyInfo.cpp b/llvm/lib/Analysis/BlockFrequencyInfo.cpp
index 96c9bfa0e372ce..ebad8388cbe410 100644
--- a/llvm/lib/Analysis/BlockFrequencyInfo.cpp
+++ b/llvm/lib/Analysis/BlockFrequencyInfo.cpp
@@ -284,7 +284,7 @@ void BlockFrequencyInfo::verifyMatch(BlockFrequencyInfo &Other) const {
Printable llvm::printBlockFreq(const BlockFrequencyInfo &BFI,
BlockFrequency Freq) {
return Printable([&BFI, Freq](raw_ostream &OS) {
- printBlockFreqImpl(OS, BFI.getEntryFreq(), Freq);
+ printRelativeBlockFreq(OS, BFI.getEntryFreq(), Freq);
});
}
diff --git a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp
index ae08d56ef098a7..9f6e53ba15b6a6 100644
--- a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp
+++ b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp
@@ -634,21 +634,6 @@ BlockFrequencyInfoImplBase::getLoopName(const LoopData &Loop) const {
return getBlockName(Loop.getHeader()) + (Loop.isIrreducible() ? "**" : "*");
}
-void llvm::printBlockFreqImpl(raw_ostream &OS, BlockFrequency EntryFreq,
- BlockFrequency Freq) {
- if (Freq == BlockFrequency(0)) {
- OS << "0";
- return;
- }
- if (EntryFreq == BlockFrequency(0)) {
- OS << "<invalid BFI>";
- return;
- }
- Scaled64 Block(Freq.getFrequency(), 0);
- Scaled64 Entry(EntryFreq.getFrequency(), 0);
- OS << Block / Entry;
-}
-
void IrreducibleGraph::addNodesInLoop(const BFIBase::LoopData &OuterLoop) {
Start = OuterLoop.getHeader();
Nodes.reserve(OuterLoop.Nodes.size());
diff --git a/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp b/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp
index 7ee72e21442630..cbebdd87398e4b 100644
--- a/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp
+++ b/llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp
@@ -280,7 +280,7 @@ BlockFrequency MachineBlockFrequencyInfo::getEntryFreq() const {
Printable llvm::printBlockFreq(const MachineBlockFrequencyInfo &MBFI,
BlockFrequency Freq) {
return Printable([&MBFI, Freq](raw_ostream &OS) {
- printBlockFreqImpl(OS, MBFI.getEntryFreq(), Freq);
+ printRelativeBlockFreq(OS, MBFI.getEntryFreq(), Freq);
});
}
diff --git a/llvm/lib/Support/BlockFrequency.cpp b/llvm/lib/Support/BlockFrequency.cpp
index 329f1e12cdc29b..9bb48425ae89ec 100644
--- a/llvm/lib/Support/BlockFrequency.cpp
+++ b/llvm/lib/Support/BlockFrequency.cpp
@@ -13,6 +13,8 @@
#include "llvm/Support/BlockFrequency.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/ScaledNumber.h"
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -45,3 +47,19 @@ std::optional<BlockFrequency> BlockFrequency::mul(uint64_t Factor) const {
return {};
return BlockFrequency(ResultFrequency);
}
+
+void llvm::printRelativeBlockFreq(raw_ostream &OS, BlockFrequency EntryFreq,
+ BlockFrequency Freq) {
+ if (Freq == BlockFrequency(0)) {
+ OS << "0";
+ return;
+ }
+ if (EntryFreq == BlockFrequency(0)) {
+ OS << "<invalid BFI>";
+ return;
+ }
+ ScaledNumber<uint64_t> Block(Freq.getFrequency(), 0);
+ ScaledNumber<uint64_t> Entry(EntryFreq.getFrequency(), 0);
+ OS << Block / Entry;
+}
+
>From 61891cf66dade93f479498914c86ca080e161037 Mon Sep 17 00:00:00 2001
From: Micah Weston <micahsweston at gmail.com>
Date: Thu, 14 Dec 2023 13:06:22 -0500
Subject: [PATCH 2/7] fixup! [BlockFrequency] Moves the block printing function
to support to use without depending on Analysis.
Fixes formatting issue.
---
llvm/lib/Support/BlockFrequency.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/lib/Support/BlockFrequency.cpp b/llvm/lib/Support/BlockFrequency.cpp
index 9bb48425ae89ec..7d5498e7cb9974 100644
--- a/llvm/lib/Support/BlockFrequency.cpp
+++ b/llvm/lib/Support/BlockFrequency.cpp
@@ -49,7 +49,7 @@ std::optional<BlockFrequency> BlockFrequency::mul(uint64_t Factor) const {
}
void llvm::printRelativeBlockFreq(raw_ostream &OS, BlockFrequency EntryFreq,
- BlockFrequency Freq) {
+ BlockFrequency Freq) {
if (Freq == BlockFrequency(0)) {
OS << "0";
return;
@@ -62,4 +62,3 @@ void llvm::printRelativeBlockFreq(raw_ostream &OS, BlockFrequency EntryFreq,
ScaledNumber<uint64_t> Entry(EntryFreq.getFrequency(), 0);
OS << Block / Entry;
}
-
>From 35dbac756ab3d7b5d1edcf14e418ccb609b15a85 Mon Sep 17 00:00:00 2001
From: Micah Weston <micahsweston at gmail.com>
Date: Sat, 17 Feb 2024 23:18:58 -0500
Subject: [PATCH 3/7] [llvm-readobj] Adds pretty printing for pgo analysis map
in readobj.
---
.../ELF/bb-addr-map-pgo-analysis-map.test | 22 ++++++++----
llvm/tools/llvm-readobj/ELFDumper.cpp | 36 ++++++++++++-------
llvm/tools/llvm-readobj/ObjDumper.h | 4 ++-
llvm/tools/llvm-readobj/Opts.td | 1 +
llvm/tools/llvm-readobj/llvm-readobj.cpp | 9 ++++-
5 files changed, 50 insertions(+), 22 deletions(-)
diff --git a/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test b/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test
index e5a9400c670c00..e511df658c4586 100644
--- a/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test
+++ b/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test
@@ -3,12 +3,14 @@
## Check 64-bit:
# RUN: yaml2obj %s -DBITS=64 -DADDR=0x999999999 -o %t1.x64.o
-# RUN: llvm-readobj %t1.x64.o --bb-addr-map 2>&1 | FileCheck %s -DADDR=0x999999999 -DFILE=%t1.x64.o --check-prefix=CHECK
+# RUN: llvm-readobj %t1.x64.o --bb-addr-map 2>&1 | FileCheck %s -DADDR=0x999999999 -DFILE=%t1.x64.o --check-prefixes=CHECK,RAW
+# RUN: llvm-readobj %t1.x64.o --bb-addr-map --pretty-pgo-analysis-map 2>&1 | FileCheck %s -DADDR=0x999999999 -DFILE=%t1.x64.o --check-prefixes=CHECK,PRETTY
# RUN: llvm-readelf %t1.x64.o --bb-addr-map | FileCheck %s --check-prefix=GNU
+# RUN: llvm-readobj %t1.x64.o --pretty-pgo-analysis-map 2>&1 | FileCheck %s --check-prefix=PRETTY-NO-BAM
## Check 32-bit:
# RUN: yaml2obj %s -DBITS=32 -o %t1.x32.o
-# RUN: llvm-readobj %t1.x32.o --bb-addr-map 2>&1 | FileCheck -DADDR=0x11111 %s -DFILE=%t1.x32.o --check-prefix=CHECK
+# RUN: llvm-readobj %t1.x32.o --bb-addr-map 2>&1 | FileCheck -DADDR=0x11111 %s -DFILE=%t1.x32.o --check-prefixes=CHECK,RAW
# RUN: llvm-readelf %t1.x32.o --bb-addr-map | FileCheck %s --check-prefix=GNU
## Check that a malformed section can be handled.
@@ -55,16 +57,19 @@
# CHECK-NEXT: FuncEntryCount: 100
# CHECK-NEXT: PGO BB entries [
# CHECK-NEXT: {
-# CHECK-NEXT: Frequency: 100
+# RAW-NEXT: Frequency: 100
+# PRETTY-NEXT: Frequency: 1.0
# CHECK-NEXT: Successors [
# CHECK-NEXT: {
# CHECK-NEXT: ID: 2
-# CHECK-NEXT: Probability: 0xFFFFFFFF
+# RAW-NEXT: Probability: 0xF0000000
+# PRETTY-NEXT: Probability: 0xf0000000 / 0x80000000 = 187.50%
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: }
# CHECK-NEXT: {
-# CHECK-NEXT: Frequency: 100
+# RAW-NEXT: Frequency: 100
+# PRETTY-NEXT: Frequency: 1.0
# CHECK-NEXT: Successors [
# CHECK-NEXT: ]
# CHECK-NEXT: }
@@ -95,7 +100,8 @@
# CHECK-NEXT: FuncEntryCount: 8888
# CHECK-NEXT: PGO BB entries [
# CHECK-NEXT: {
-# CHECK-NEXT: Frequency: 9000
+# RAW-NEXT: Frequency: 9000
+# PRETTY-NEXT: Frequency: 1.0
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: }
@@ -104,6 +110,8 @@
# GNU: GNUStyle::printBBAddrMaps not implemented
+# PRETTY-NO-BAM: warning: --bb-addr-map must be enabled for --pretty-pgo-analysis-map to have an effect
+
# TRUNCATED: BBAddrMap [
# TRUNCATED-NEXT: warning: '[[FILE]]': unable to dump SHT_LLVM_BB_ADDR_MAP section with index 3: unable to decode LEB128 at offset [[OFFSET]]: malformed uleb128, extends past end
# TRUNCATED-NEXT: ]
@@ -192,7 +200,7 @@ Sections:
- BBFreq: 100
Successors:
- ID: 2
- BrProb: 0xFFFFFFFF
+ BrProb: 0xF0000000
- BBFreq: 100
Successors: []
- FuncEntryCount: 8888
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 50ea63e87a43be..49dc6b9927577a 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -593,7 +593,7 @@ template <typename ELFT> class GNUELFDumper : public ELFDumper<ELFT> {
void printVersionDefinitionSection(const Elf_Shdr *Sec) override;
void printVersionDependencySection(const Elf_Shdr *Sec) override;
void printCGProfile() override;
- void printBBAddrMaps() override;
+ void printBBAddrMaps(bool PrettyPGOAnalysis) override;
void printAddrsig() override;
void printNotes() override;
void printELFLinkerOptions() override;
@@ -704,7 +704,7 @@ template <typename ELFT> class LLVMELFDumper : public ELFDumper<ELFT> {
void printVersionDefinitionSection(const Elf_Shdr *Sec) override;
void printVersionDependencySection(const Elf_Shdr *Sec) override;
void printCGProfile() override;
- void printBBAddrMaps() override;
+ void printBBAddrMaps(bool PrettyPGOAnalysis) override;
void printAddrsig() override;
void printNotes() override;
void printELFLinkerOptions() override;
@@ -5031,7 +5031,7 @@ template <class ELFT> void GNUELFDumper<ELFT>::printCGProfile() {
OS << "GNUStyle::printCGProfile not implemented\n";
}
-template <class ELFT> void GNUELFDumper<ELFT>::printBBAddrMaps() {
+template <class ELFT> void GNUELFDumper<ELFT>::printBBAddrMaps(bool) {
OS << "GNUStyle::printBBAddrMaps not implemented\n";
}
@@ -7521,7 +7521,8 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printCGProfile() {
}
}
-template <class ELFT> void LLVMELFDumper<ELFT>::printBBAddrMaps() {
+template <class ELFT>
+void LLVMELFDumper<ELFT>::printBBAddrMaps(bool PrettyPGOAnalysis) {
bool IsRelocatable = this->Obj.getHeader().e_type == ELF::ET_REL;
using Elf_Shdr = typename ELFT::Shdr;
auto IsMatch = [](const Elf_Shdr &Sec) -> bool {
@@ -7597,24 +7598,33 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printBBAddrMaps() {
if (PAM.FeatEnable.hasPGOAnalysisBBData()) {
ListScope L(W, "PGO BB entries");
+ BlockFrequency EntryFreq{};
+ if (PrettyPGOAnalysis && !PAM.BBEntries.empty())
+ EntryFreq = PAM.BBEntries.front().BlockFreq;
for (const PGOAnalysisMap::PGOBBEntry &PBBE : PAM.BBEntries) {
DictScope L(W);
- /// FIXME: currently we just emit the raw frequency, it may be
- /// better to provide an option to scale it by the first entry
- /// frequence using BlockFrequency::Scaled64 number
- if (PAM.FeatEnable.BBFreq)
- W.printNumber("Frequency", PBBE.BlockFreq.getFrequency());
+ if (PAM.FeatEnable.BBFreq) {
+ if (PrettyPGOAnalysis) {
+ std::string BlockFreqStr;
+ raw_string_ostream SS(BlockFreqStr);
+ printRelativeBlockFreq(SS, EntryFreq, PBBE.BlockFreq);
+ W.printString("Frequency", BlockFreqStr);
+ } else {
+ W.printNumber("Frequency", PBBE.BlockFreq.getFrequency());
+ }
+ }
if (PAM.FeatEnable.BrProb) {
ListScope L(W, "Successors");
for (const auto &Succ : PBBE.Successors) {
DictScope L(W);
W.printNumber("ID", Succ.ID);
- /// FIXME: currently we just emit the raw numerator of the
- /// probably, it may be better to provide an option to emit it
- /// as a percentage or other prettied representation
- W.printHex("Probability", Succ.Prob.getNumerator());
+ if (PrettyPGOAnalysis) {
+ W.printObject("Probability", Succ.Prob);
+ } else {
+ W.printHex("Probability", Succ.Prob.getNumerator());
+ }
}
}
}
diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h
index 1d679453581bc8..ae51019fa30bbb 100644
--- a/llvm/tools/llvm-readobj/ObjDumper.h
+++ b/llvm/tools/llvm-readobj/ObjDumper.h
@@ -129,7 +129,9 @@ class ObjDumper {
virtual void printGroupSections() {}
virtual void printHashHistograms() {}
virtual void printCGProfile() {}
- virtual void printBBAddrMaps() {}
+ // If PrettyPGOAnalysis is true, prints BFI as relative frequency and BPI as
+ // percentage. Otherwise raw values are displayed.
+ virtual void printBBAddrMaps(bool PrettyPGOAnalysis) {}
virtual void printAddrsig() {}
virtual void printNotes() {}
virtual void printELFLinkerOptions() {}
diff --git a/llvm/tools/llvm-readobj/Opts.td b/llvm/tools/llvm-readobj/Opts.td
index e2d93c6ec229e9..765a43fdef7cef 100644
--- a/llvm/tools/llvm-readobj/Opts.td
+++ b/llvm/tools/llvm-readobj/Opts.td
@@ -19,6 +19,7 @@ def all : FF<"all", "Equivalent to setting: --file-header, --program-headers, --
"--section-groups and --histogram">;
def arch_specific : FF<"arch-specific", "Display architecture-specific information">;
def bb_addr_map : FF<"bb-addr-map", "Display the BB address map section">;
+def pretty_pgo_analysis_map : FF<"pretty-pgo-analysis-map", "Display PGO analysis values with formatting rather than raw numbers">;
def cg_profile : FF<"cg-profile", "Display call graph profile section">;
defm demangle : BB<"demangle", "Demangle symbol names", "Do not demangle symbol names (default)">;
def dependent_libraries : FF<"dependent-libraries", "Display the dependent libraries section">;
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index f9d605d35244bf..ce2c332529581a 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp
@@ -95,6 +95,7 @@ static bool Addrsig;
static bool All;
static bool ArchSpecificInfo;
static bool BBAddrMap;
+static bool PrettyPGOAnalysisMap;
bool ExpandRelocs;
static bool CGProfile;
bool Demangle;
@@ -211,6 +212,12 @@ static void parseOptions(const opt::InputArgList &Args) {
opts::All = Args.hasArg(OPT_all);
opts::ArchSpecificInfo = Args.hasArg(OPT_arch_specific);
opts::BBAddrMap = Args.hasArg(OPT_bb_addr_map);
+ opts::PrettyPGOAnalysisMap = Args.hasArg(OPT_pretty_pgo_analysis_map);
+ if (opts::PrettyPGOAnalysisMap && !opts::BBAddrMap) {
+ WithColor::warning(errs(), ToolName)
+ << "--bb-addr-map must be enabled for --pretty-pgo-analysis-map to "
+ "have an effect\n";
+ }
opts::CGProfile = Args.hasArg(OPT_cg_profile);
opts::Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle, false);
opts::DependentLibraries = Args.hasArg(OPT_dependent_libraries);
@@ -464,7 +471,7 @@ static void dumpObject(ObjectFile &Obj, ScopedPrinter &Writer,
if (opts::CGProfile)
Dumper->printCGProfile();
if (opts::BBAddrMap)
- Dumper->printBBAddrMaps();
+ Dumper->printBBAddrMaps(opts::PrettyPGOAnalysisMap);
if (opts::Addrsig)
Dumper->printAddrsig();
if (opts::Notes)
>From 876fc8853436bf88ae1c515a6b8a6923a1cc9fe2 Mon Sep 17 00:00:00 2001
From: Micah Weston <micahsweston at gmail.com>
Date: Mon, 19 Feb 2024 19:41:29 -0500
Subject: [PATCH 4/7] [llvm-objdump] Updates PGO analysis printing.
---
.../llvm-objdump/X86/elf-pgoanalysismap.yaml | 34 ++++++++++++++-----
.../ELF/bb-addr-map-pgo-analysis-map.test | 6 ++--
llvm/tools/llvm-objdump/llvm-objdump.cpp | 28 +++++++++++----
llvm/tools/llvm-readobj/ELFDumper.cpp | 6 ++--
4 files changed, 51 insertions(+), 23 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml b/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
index 732fab3e2a378c..8ac9b1434aaef8 100644
--- a/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
+++ b/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
@@ -48,6 +48,8 @@ Symbols:
# RUN: yaml2obj %s --docnum=2 -o %t2
# RUN: llvm-objdump %t2 -d --symbolize-operands --no-show-raw-insn --no-leading-addr | \
# RUN: FileCheck %s --check-prefix=ENTRYCOUNT-BLOCKFREQ
+# RUN: llvm-objdump %t2 -d --symbolize-operands --pretty-pgo-analysis-map --no-show-raw-insn --no-leading-addr | \
+# RUN: FileCheck %s --check-prefix=ENTRYCOUNT-BLOCKFREQ-PRETTY
--- !ELF
FileHeader:
@@ -104,12 +106,20 @@ Symbols:
# ENTRYCOUNT-BLOCKFREQ: <BB2> (Frequency: 18):
# ENTRYCOUNT-BLOCKFREQ: <BB5> (Frequency: 1000):
+# ENTRYCOUNT-BLOCKFREQ-PRETTY: <foo>:
+# ENTRYCOUNT-BLOCKFREQ-PRETTY: <BB3> (Entry count: 1000, Frequency: 1.0):
+# ENTRYCOUNT-BLOCKFREQ-PRETTY: <BB1> (Frequency: 0.133):
+# ENTRYCOUNT-BLOCKFREQ-PRETTY: <BB2> (Frequency: 0.018):
+# ENTRYCOUNT-BLOCKFREQ-PRETTY: <BB5> (Frequency: 1.0):
+
## Check the case where we have entry points, block frequency, and branch
## proabability information.
# RUN: yaml2obj %s --docnum=3 -o %t3
# RUN: llvm-objdump %t3 -d --symbolize-operands --no-show-raw-insn --no-leading-addr | \
# RUN: FileCheck %s --check-prefix=ENTRY-FREQ-PROB
+# RUN: llvm-objdump %t3 -d --symbolize-operands --pretty-pgo-analysis-map --no-show-raw-insn --no-leading-addr | \
+# RUN: FileCheck %s --check-prefix=ENTRY-FREQ-PROB-PRETTY
--- !ELF
FileHeader:
@@ -154,21 +164,21 @@ Sections:
- BBFreq: 1000
Successors:
- ID: 1
- BrProb: 0x22222222
+ BrProb: 0x10000000
- ID: 2
- BrProb: 0x33333333
+ BrProb: 0x15000000
- ID: 3
- BrProb: 0xaaaaaaaa
+ BrProb: 0x50000000
- BBFreq: 133
Successors:
- ID: 2
- BrProb: 0x11111111
+ BrProb: 0x10000000
- ID: 3
- BrProb: 0xeeeeeeee
+ BrProb: 0x70000000
- BBFreq: 18
Successors:
- ID: 3
- BrProb: 0xffffffff
+ BrProb: 0x80000000
- BBFreq: 1000
Successors: []
Symbols:
@@ -177,7 +187,13 @@ Symbols:
Value: 0x0
# ENTRY-FREQ-PROB: <foo>:
-# ENTRY-FREQ-PROB: <BB3> (Entry count: 1000, Frequency: 1000, Successors: BB1:22222222, BB2:33333333, BB3:aaaaaaaa):
-# ENTRY-FREQ-PROB: <BB1> (Frequency: 133, Successors: BB2:11111111, BB3:eeeeeeee):
-# ENTRY-FREQ-PROB: <BB2> (Frequency: 18, Successors: BB3:ffffffff):
+# ENTRY-FREQ-PROB: <BB3> (Entry count: 1000, Frequency: 1000, Successors: BB1:10000000, BB2:15000000, BB3:50000000):
+# ENTRY-FREQ-PROB: <BB1> (Frequency: 133, Successors: BB2:10000000, BB3:70000000):
+# ENTRY-FREQ-PROB: <BB2> (Frequency: 18, Successors: BB3:80000000):
# ENTRY-FREQ-PROB: <BB5> (Frequency: 1000):
+
+# ENTRY-FREQ-PROB-PRETTY: <foo>:
+# ENTRY-FREQ-PROB-PRETTY: <BB3> (Entry count: 1000, Frequency: 1.0, Successors: BB1:[0x10000000 / 0x80000000 = 12.50%], BB2:[0x15000000 / 0x80000000 = 16.41%], BB3:[0x50000000 / 0x80000000 = 62.50%]):
+# ENTRY-FREQ-PROB-PRETTY: <BB1> (Frequency: 0.133, Successors: BB2:[0x10000000 / 0x80000000 = 12.50%], BB3:[0x70000000 / 0x80000000 = 87.50%]):
+# ENTRY-FREQ-PROB-PRETTY: <BB2> (Frequency: 0.018, Successors: BB3:[0x80000000 / 0x80000000 = 100.00%]):
+# ENTRY-FREQ-PROB-PRETTY: <BB5> (Frequency: 1.0):
diff --git a/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test b/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test
index e511df658c4586..1ad5d5f7611268 100644
--- a/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test
+++ b/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test
@@ -62,8 +62,8 @@
# CHECK-NEXT: Successors [
# CHECK-NEXT: {
# CHECK-NEXT: ID: 2
-# RAW-NEXT: Probability: 0xF0000000
-# PRETTY-NEXT: Probability: 0xf0000000 / 0x80000000 = 187.50%
+# RAW-NEXT: Probability: 0x80000000
+# PRETTY-NEXT: Probability: 0x80000000 / 0x80000000 = 100.00%
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: }
@@ -200,7 +200,7 @@ Sections:
- BBFreq: 100
Successors:
- ID: 2
- BrProb: 0xF0000000
+ BrProb: 0x80000000
- BBFreq: 100
Successors: []
- FuncEntryCount: 8888
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 948a5d74e1ab2b..7a398e35a8eb53 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -188,8 +188,10 @@ class BBAddrMapFunctionEntry {
const BBAddrMap &getAddrMap() const { return AddrMap; }
// Returns the PGO string associated with the entry of index `PGOBBEntryIndex`
- // in `PGOMap`.
- std::string constructPGOLabelString(size_t PGOBBEntryIndex) const {
+ // in `PGOMap`. If PrettyPGOAnalysis is true, prints BFI as relative frequency
+ // and BPI as percentage. Otherwise raw values are displayed.
+ std::string constructPGOLabelString(size_t PGOBBEntryIndex,
+ bool PrettyPGOAnalysis) const {
if (!PGOMap.FeatEnable.hasPGOAnalysis())
return "";
std::string PGOString;
@@ -211,7 +213,13 @@ class BBAddrMapFunctionEntry {
PGOMap.BBEntries[PGOBBEntryIndex];
if (PGOMap.FeatEnable.BBFreq) {
- PGOSS << "Frequency: " << Twine(PGOBBEntry.BlockFreq.getFrequency());
+ PGOSS << "Frequency: ";
+ if (PrettyPGOAnalysis) {
+ printRelativeBlockFreq(PGOSS, PGOMap.BBEntries.front().BlockFreq,
+ PGOBBEntry.BlockFreq);
+ } else {
+ PGOSS << Twine(PGOBBEntry.BlockFreq.getFrequency());
+ }
if (PGOMap.FeatEnable.BrProb && PGOBBEntry.Successors.size() > 0) {
PGOSS << ", ";
}
@@ -220,9 +228,13 @@ class BBAddrMapFunctionEntry {
PGOSS << "Successors: ";
interleaveComma(
PGOBBEntry.Successors, PGOSS,
- [&PGOSS](const PGOAnalysisMap::PGOBBEntry::SuccessorEntry &SE) {
+ [&](const PGOAnalysisMap::PGOBBEntry::SuccessorEntry &SE) {
PGOSS << "BB" << SE.ID << ":";
- PGOSS.write_hex(SE.Prob.getNumerator());
+ if (PrettyPGOAnalysis) {
+ PGOSS << "[" << SE.Prob << "]";
+ } else {
+ PGOSS.write_hex(SE.Prob.getNumerator());
+ }
});
}
}
@@ -331,6 +343,7 @@ static bool HasStopAddressFlag;
bool objdump::SymbolTable;
static bool SymbolizeOperands;
+static bool PrettyPGOAnalysisMap;
static bool DynamicSymbolTable;
std::string objdump::TripleName;
bool objdump::UnwindInfo;
@@ -1410,8 +1423,8 @@ static void collectBBAddrMapLabels(
std::string LabelString = ("BB" + Twine(BBEntry.ID)).str();
Labels[BBAddress].push_back(
- {LabelString,
- FunctionMap->constructPGOLabelString(NumBBEntriesBeforeRange + I)});
+ {LabelString, FunctionMap->constructPGOLabelString(
+ NumBBEntriesBeforeRange + I, PrettyPGOAnalysisMap)});
}
}
@@ -3473,6 +3486,7 @@ static void parseObjdumpOptions(const llvm::opt::InputArgList &InputArgs) {
HasStopAddressFlag = InputArgs.hasArg(OBJDUMP_stop_address_EQ);
SymbolTable = InputArgs.hasArg(OBJDUMP_syms);
SymbolizeOperands = InputArgs.hasArg(OBJDUMP_symbolize_operands);
+ PrettyPGOAnalysisMap = InputArgs.hasArg(OBJDUMP_pretty_pgo_analysis_map);
DynamicSymbolTable = InputArgs.hasArg(OBJDUMP_dynamic_syms);
TripleName = InputArgs.getLastArgValue(OBJDUMP_triple_EQ).str();
UnwindInfo = InputArgs.hasArg(OBJDUMP_unwind_info);
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 49dc6b9927577a..9710fcf14430e7 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -7598,9 +7598,6 @@ void LLVMELFDumper<ELFT>::printBBAddrMaps(bool PrettyPGOAnalysis) {
if (PAM.FeatEnable.hasPGOAnalysisBBData()) {
ListScope L(W, "PGO BB entries");
- BlockFrequency EntryFreq{};
- if (PrettyPGOAnalysis && !PAM.BBEntries.empty())
- EntryFreq = PAM.BBEntries.front().BlockFreq;
for (const PGOAnalysisMap::PGOBBEntry &PBBE : PAM.BBEntries) {
DictScope L(W);
@@ -7608,7 +7605,8 @@ void LLVMELFDumper<ELFT>::printBBAddrMaps(bool PrettyPGOAnalysis) {
if (PrettyPGOAnalysis) {
std::string BlockFreqStr;
raw_string_ostream SS(BlockFreqStr);
- printRelativeBlockFreq(SS, EntryFreq, PBBE.BlockFreq);
+ printRelativeBlockFreq(SS, PAM.BBEntries.front().BlockFreq,
+ PBBE.BlockFreq);
W.printString("Frequency", BlockFreqStr);
} else {
W.printNumber("Frequency", PBBE.BlockFreq.getFrequency());
>From dc8924724aed8ec6fd095c2411d7488f9a01ae89 Mon Sep 17 00:00:00 2001
From: Micah Weston <micahsweston at gmail.com>
Date: Mon, 19 Feb 2024 19:54:16 -0500
Subject: [PATCH 5/7] Adds warning and test for objdump option.
---
llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml | 4 ++++
llvm/tools/llvm-objdump/llvm-objdump.cpp | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml b/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
index 8ac9b1434aaef8..3f62418f53144f 100644
--- a/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
+++ b/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
@@ -120,6 +120,8 @@ Symbols:
# RUN: FileCheck %s --check-prefix=ENTRY-FREQ-PROB
# RUN: llvm-objdump %t3 -d --symbolize-operands --pretty-pgo-analysis-map --no-show-raw-insn --no-leading-addr | \
# RUN: FileCheck %s --check-prefix=ENTRY-FREQ-PROB-PRETTY
+# RUN: llvm-objdump %t3 -d --pretty-pgo-analysis-map --no-show-raw-insn --no-leading-addr 2>&1 | \
+# RUN: FileCheck %s --check-prefix=MISSING-SYMBOLIZE-OPERANDS
--- !ELF
FileHeader:
@@ -197,3 +199,5 @@ Symbols:
# ENTRY-FREQ-PROB-PRETTY: <BB1> (Frequency: 0.133, Successors: BB2:[0x10000000 / 0x80000000 = 12.50%], BB3:[0x70000000 / 0x80000000 = 87.50%]):
# ENTRY-FREQ-PROB-PRETTY: <BB2> (Frequency: 0.018, Successors: BB3:[0x80000000 / 0x80000000 = 100.00%]):
# ENTRY-FREQ-PROB-PRETTY: <BB5> (Frequency: 1.0):
+
+# MISSING-SYMBOLIZE-OPERANDS: warning: --symbolize-operands must be enabled for --pretty-pgo-analysis-map to have an effect
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 7a398e35a8eb53..fdc7675b2f732d 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3487,6 +3487,10 @@ static void parseObjdumpOptions(const llvm::opt::InputArgList &InputArgs) {
SymbolTable = InputArgs.hasArg(OBJDUMP_syms);
SymbolizeOperands = InputArgs.hasArg(OBJDUMP_symbolize_operands);
PrettyPGOAnalysisMap = InputArgs.hasArg(OBJDUMP_pretty_pgo_analysis_map);
+ if (PrettyPGOAnalysisMap && !SymbolizeOperands) {
+ reportCmdLineWarning("--symbolize-operands must be enabled for "
+ "--pretty-pgo-analysis-map to have an effect");
+ }
DynamicSymbolTable = InputArgs.hasArg(OBJDUMP_dynamic_syms);
TripleName = InputArgs.getLastArgValue(OBJDUMP_triple_EQ).str();
UnwindInfo = InputArgs.hasArg(OBJDUMP_unwind_info);
>From 6aa1e45159bae82aa8b0b5fcffa3aef6711b157b Mon Sep 17 00:00:00 2001
From: Micah Weston <micahsweston at gmail.com>
Date: Wed, 21 Feb 2024 20:34:56 -0500
Subject: [PATCH 6/7] Addresses reviewer style feedback.
---
llvm/tools/llvm-objdump/llvm-objdump.cpp | 13 +++++--------
llvm/tools/llvm-readobj/ELFDumper.cpp | 3 ++-
llvm/tools/llvm-readobj/llvm-readobj.cpp | 3 +--
3 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index fdc7675b2f732d..78cf67b1e630bb 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -214,12 +214,11 @@ class BBAddrMapFunctionEntry {
if (PGOMap.FeatEnable.BBFreq) {
PGOSS << "Frequency: ";
- if (PrettyPGOAnalysis) {
+ if (PrettyPGOAnalysis)
printRelativeBlockFreq(PGOSS, PGOMap.BBEntries.front().BlockFreq,
PGOBBEntry.BlockFreq);
- } else {
+ else
PGOSS << Twine(PGOBBEntry.BlockFreq.getFrequency());
- }
if (PGOMap.FeatEnable.BrProb && PGOBBEntry.Successors.size() > 0) {
PGOSS << ", ";
}
@@ -230,11 +229,10 @@ class BBAddrMapFunctionEntry {
PGOBBEntry.Successors, PGOSS,
[&](const PGOAnalysisMap::PGOBBEntry::SuccessorEntry &SE) {
PGOSS << "BB" << SE.ID << ":";
- if (PrettyPGOAnalysis) {
+ if (PrettyPGOAnalysis)
PGOSS << "[" << SE.Prob << "]";
- } else {
+ else
PGOSS.write_hex(SE.Prob.getNumerator());
- }
});
}
}
@@ -3487,10 +3485,9 @@ static void parseObjdumpOptions(const llvm::opt::InputArgList &InputArgs) {
SymbolTable = InputArgs.hasArg(OBJDUMP_syms);
SymbolizeOperands = InputArgs.hasArg(OBJDUMP_symbolize_operands);
PrettyPGOAnalysisMap = InputArgs.hasArg(OBJDUMP_pretty_pgo_analysis_map);
- if (PrettyPGOAnalysisMap && !SymbolizeOperands) {
+ if (PrettyPGOAnalysisMap && !SymbolizeOperands)
reportCmdLineWarning("--symbolize-operands must be enabled for "
"--pretty-pgo-analysis-map to have an effect");
- }
DynamicSymbolTable = InputArgs.hasArg(OBJDUMP_dynamic_syms);
TripleName = InputArgs.getLastArgValue(OBJDUMP_triple_EQ).str();
UnwindInfo = InputArgs.hasArg(OBJDUMP_unwind_info);
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 9710fcf14430e7..33ee6055b9b4d1 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -5031,7 +5031,8 @@ template <class ELFT> void GNUELFDumper<ELFT>::printCGProfile() {
OS << "GNUStyle::printCGProfile not implemented\n";
}
-template <class ELFT> void GNUELFDumper<ELFT>::printBBAddrMaps(bool) {
+template <class ELFT>
+void GNUELFDumper<ELFT>::printBBAddrMaps(bool /*PrettyPGOAnalysis*/) {
OS << "GNUStyle::printBBAddrMaps not implemented\n";
}
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index ce2c332529581a..43e976d106ead8 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp
@@ -213,11 +213,10 @@ static void parseOptions(const opt::InputArgList &Args) {
opts::ArchSpecificInfo = Args.hasArg(OPT_arch_specific);
opts::BBAddrMap = Args.hasArg(OPT_bb_addr_map);
opts::PrettyPGOAnalysisMap = Args.hasArg(OPT_pretty_pgo_analysis_map);
- if (opts::PrettyPGOAnalysisMap && !opts::BBAddrMap) {
+ if (opts::PrettyPGOAnalysisMap && !opts::BBAddrMap)
WithColor::warning(errs(), ToolName)
<< "--bb-addr-map must be enabled for --pretty-pgo-analysis-map to "
"have an effect\n";
- }
opts::CGProfile = Args.hasArg(OPT_cg_profile);
opts::Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle, false);
opts::DependentLibraries = Args.hasArg(OPT_dependent_libraries);
>From 897fd372282585a2175218ba87ff56b0460e7060 Mon Sep 17 00:00:00 2001
From: Micah Weston <micahsweston at gmail.com>
Date: Wed, 21 Feb 2024 20:42:03 -0500
Subject: [PATCH 7/7] Adds stricter line matching for objdump test.
---
llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml b/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
index 3f62418f53144f..a0e79c9f40e157 100644
--- a/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
+++ b/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml
@@ -47,9 +47,9 @@ Symbols:
# RUN: yaml2obj %s --docnum=2 -o %t2
# RUN: llvm-objdump %t2 -d --symbolize-operands --no-show-raw-insn --no-leading-addr | \
-# RUN: FileCheck %s --check-prefix=ENTRYCOUNT-BLOCKFREQ
+# RUN: FileCheck --match-full-lines %s --check-prefix=ENTRYCOUNT-BLOCKFREQ
# RUN: llvm-objdump %t2 -d --symbolize-operands --pretty-pgo-analysis-map --no-show-raw-insn --no-leading-addr | \
-# RUN: FileCheck %s --check-prefix=ENTRYCOUNT-BLOCKFREQ-PRETTY
+# RUN: FileCheck --match-full-lines %s --check-prefix=ENTRYCOUNT-BLOCKFREQ-PRETTY
--- !ELF
FileHeader:
@@ -117,9 +117,9 @@ Symbols:
# RUN: yaml2obj %s --docnum=3 -o %t3
# RUN: llvm-objdump %t3 -d --symbolize-operands --no-show-raw-insn --no-leading-addr | \
-# RUN: FileCheck %s --check-prefix=ENTRY-FREQ-PROB
+# RUN: FileCheck --match-full-lines %s --check-prefix=ENTRY-FREQ-PROB
# RUN: llvm-objdump %t3 -d --symbolize-operands --pretty-pgo-analysis-map --no-show-raw-insn --no-leading-addr | \
-# RUN: FileCheck %s --check-prefix=ENTRY-FREQ-PROB-PRETTY
+# RUN: FileCheck --match-full-lines %s --check-prefix=ENTRY-FREQ-PROB-PRETTY
# RUN: llvm-objdump %t3 -d --pretty-pgo-analysis-map --no-show-raw-insn --no-leading-addr 2>&1 | \
# RUN: FileCheck %s --check-prefix=MISSING-SYMBOLIZE-OPERANDS
More information about the llvm-commits
mailing list