mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
Add options to dump PGO counts in text.
Summary: Added text options to -pgo-view-counts and -pgo-view-raw-counts that dump block frequency and branch probability info in text. This is useful when the graph is very large and complex (the dot command crashes, lines/edges too close to tell apart, hard to navigate without textual search) or simply when text is preferred. Reviewers: davidxl Reviewed By: davidxl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D37776 llvm-svn: 313159
This commit is contained in:
parent
8624d633ae
commit
3fdeae8ddd
@ -31,6 +31,8 @@ class Module;
|
||||
class raw_ostream;
|
||||
template <class BlockT> class BlockFrequencyInfoImpl;
|
||||
|
||||
enum PGOViewCountsType { PGOVCT_None, PGOVCT_Graph, PGOVCT_Text };
|
||||
|
||||
/// BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to
|
||||
/// estimate IR basic block frequencies.
|
||||
class BlockFrequencyInfo {
|
||||
|
@ -61,19 +61,22 @@ cl::opt<unsigned>
|
||||
"is no less than the max frequency of the "
|
||||
"function multiplied by this percent."));
|
||||
|
||||
// Command line option to turn on CFG dot dump after profile annotation.
|
||||
cl::opt<bool>
|
||||
PGOViewCounts("pgo-view-counts", cl::init(false), cl::Hidden,
|
||||
cl::desc("A boolean option to show CFG dag with "
|
||||
"block profile counts and branch probabilities "
|
||||
"right after PGO profile annotation step. The "
|
||||
"profile counts are computed using branch "
|
||||
"probabilities from the runtime profile data and "
|
||||
"block frequency propagation algorithm. To view "
|
||||
"the raw counts from the profile, use option "
|
||||
"-pgo-view-raw-counts instead. To limit graph "
|
||||
"display to only one function, use filtering option "
|
||||
"-view-bfi-func-name."));
|
||||
// Command line option to turn on CFG dot or text dump after profile annotation.
|
||||
cl::opt<PGOViewCountsType> PGOViewCounts(
|
||||
"pgo-view-counts", cl::Hidden,
|
||||
cl::desc("A boolean option to show CFG dag or text with "
|
||||
"block profile counts and branch probabilities "
|
||||
"right after PGO profile annotation step. The "
|
||||
"profile counts are computed using branch "
|
||||
"probabilities from the runtime profile data and "
|
||||
"block frequency propagation algorithm. To view "
|
||||
"the raw counts from the profile, use option "
|
||||
"-pgo-view-raw-counts instead. To limit graph "
|
||||
"display to only one function, use filtering option "
|
||||
"-view-bfi-func-name."),
|
||||
cl::values(clEnumValN(PGOVCT_None, "none", "do not show."),
|
||||
clEnumValN(PGOVCT_Graph, "graph", "show a graph."),
|
||||
clEnumValN(PGOVCT_Text, "text", "show in text.")));
|
||||
|
||||
static cl::opt<bool> PrintBlockFreq(
|
||||
"print-bfi", cl::init(false), cl::Hidden,
|
||||
@ -87,7 +90,7 @@ cl::opt<std::string> PrintBlockFreqFuncName(
|
||||
namespace llvm {
|
||||
|
||||
static GVDAGType getGVDT() {
|
||||
if (PGOViewCounts)
|
||||
if (PGOViewCounts == PGOVCT_Graph)
|
||||
return GVDT_Count;
|
||||
return ViewBlockFreqPropagationDAG;
|
||||
}
|
||||
|
@ -167,15 +167,18 @@ static cl::opt<bool>
|
||||
cl::desc("Use this option to turn on/off SELECT "
|
||||
"instruction instrumentation. "));
|
||||
|
||||
// Command line option to turn on CFG dot dump of raw profile counts
|
||||
static cl::opt<bool>
|
||||
PGOViewRawCounts("pgo-view-raw-counts", cl::init(false), cl::Hidden,
|
||||
cl::desc("A boolean option to show CFG dag "
|
||||
"with raw profile counts from "
|
||||
"profile data. See also option "
|
||||
"-pgo-view-counts. To limit graph "
|
||||
"display to only one function, use "
|
||||
"filtering option -view-bfi-func-name."));
|
||||
// Command line option to turn on CFG dot or text dump of raw profile counts
|
||||
static cl::opt<PGOViewCountsType> PGOViewRawCounts(
|
||||
"pgo-view-raw-counts", cl::Hidden,
|
||||
cl::desc("A boolean option to show CFG dag or text "
|
||||
"with raw profile counts from "
|
||||
"profile data. See also option "
|
||||
"-pgo-view-counts. To limit graph "
|
||||
"display to only one function, use "
|
||||
"filtering option -view-bfi-func-name."),
|
||||
cl::values(clEnumValN(PGOVCT_None, "none", "do not show."),
|
||||
clEnumValN(PGOVCT_Graph, "graph", "show a graph."),
|
||||
clEnumValN(PGOVCT_Text, "text", "show in text.")));
|
||||
|
||||
// Command line option to enable/disable memop intrinsic call.size profiling.
|
||||
static cl::opt<bool>
|
||||
@ -193,7 +196,7 @@ static cl::opt<bool>
|
||||
|
||||
// Command line option to turn on CFG dot dump after profile annotation.
|
||||
// Defined in Analysis/BlockFrequencyInfo.cpp: -pgo-view-counts
|
||||
extern cl::opt<bool> PGOViewCounts;
|
||||
extern cl::opt<PGOViewCountsType> PGOViewCounts;
|
||||
|
||||
// Command line option to specify the name of the function for CFG dump
|
||||
// Defined in Analysis/BlockFrequencyInfo.cpp: -view-bfi-func-name=
|
||||
@ -831,6 +834,10 @@ public:
|
||||
|
||||
Function &getFunc() const { return F; }
|
||||
|
||||
void dumpInfo(std::string Str = "") const {
|
||||
FuncInfo.dumpInfo(Str);
|
||||
}
|
||||
|
||||
private:
|
||||
Function &F;
|
||||
Module *M;
|
||||
@ -1386,22 +1393,33 @@ static bool annotateAllFunctions(
|
||||
ColdFunctions.push_back(&F);
|
||||
else if (FreqAttr == PGOUseFunc::FFA_Hot)
|
||||
HotFunctions.push_back(&F);
|
||||
if (PGOViewCounts && (ViewBlockFreqFuncName.empty() ||
|
||||
F.getName().equals(ViewBlockFreqFuncName))) {
|
||||
if (PGOViewCounts != PGOVCT_None &&
|
||||
(ViewBlockFreqFuncName.empty() ||
|
||||
F.getName().equals(ViewBlockFreqFuncName))) {
|
||||
LoopInfo LI{DominatorTree(F)};
|
||||
std::unique_ptr<BranchProbabilityInfo> NewBPI =
|
||||
llvm::make_unique<BranchProbabilityInfo>(F, LI);
|
||||
std::unique_ptr<BlockFrequencyInfo> NewBFI =
|
||||
llvm::make_unique<BlockFrequencyInfo>(F, *NewBPI, LI);
|
||||
|
||||
NewBFI->view();
|
||||
if (PGOViewCounts == PGOVCT_Graph)
|
||||
NewBFI->view();
|
||||
else if (PGOViewCounts == PGOVCT_Text) {
|
||||
dbgs() << "pgo-view-counts: " << Func.getFunc().getName() << "\n";
|
||||
NewBFI->print(dbgs());
|
||||
}
|
||||
}
|
||||
if (PGOViewRawCounts && (ViewBlockFreqFuncName.empty() ||
|
||||
F.getName().equals(ViewBlockFreqFuncName))) {
|
||||
if (ViewBlockFreqFuncName.empty())
|
||||
WriteGraph(&Func, Twine("PGORawCounts_") + Func.getFunc().getName());
|
||||
else
|
||||
ViewGraph(&Func, Twine("PGORawCounts_") + Func.getFunc().getName());
|
||||
if (PGOViewRawCounts != PGOVCT_None &&
|
||||
(ViewBlockFreqFuncName.empty() ||
|
||||
F.getName().equals(ViewBlockFreqFuncName))) {
|
||||
if (PGOViewRawCounts == PGOVCT_Graph)
|
||||
if (ViewBlockFreqFuncName.empty())
|
||||
WriteGraph(&Func, Twine("PGORawCounts_") + Func.getFunc().getName());
|
||||
else
|
||||
ViewGraph(&Func, Twine("PGORawCounts_") + Func.getFunc().getName());
|
||||
else if (PGOViewRawCounts == PGOVCT_Text) {
|
||||
dbgs() << "pgo-view-raw-counts: " << Func.getFunc().getName() << "\n";
|
||||
Func.dumpInfo();
|
||||
}
|
||||
}
|
||||
}
|
||||
M.setProfileSummary(PGOReader->getSummary().getMD(M.getContext()));
|
||||
|
Loading…
Reference in New Issue
Block a user