diff options
| author | Hiroshi Yamauchi <yamauchi@google.com> | 2017-09-13 17:20:38 +0000 |
|---|---|---|
| committer | Hiroshi Yamauchi <yamauchi@google.com> | 2017-09-13 17:20:38 +0000 |
| commit | a43913cfaf3ea2202a39c02d19ccc05a0a2fe193 (patch) | |
| tree | 766e4d68e2e0146a8fd1286d30c03cdcff46657b /llvm | |
| parent | cbdc5ff628535761663367ab67621087aadd0d5f (diff) | |
| download | bcm5719-llvm-a43913cfaf3ea2202a39c02d19ccc05a0a2fe193.tar.gz bcm5719-llvm-a43913cfaf3ea2202a39c02d19ccc05a0a2fe193.zip | |
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
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Analysis/BlockFrequencyInfo.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Analysis/BlockFrequencyInfo.cpp | 31 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp | 58 |
3 files changed, 57 insertions, 34 deletions
diff --git a/llvm/include/llvm/Analysis/BlockFrequencyInfo.h b/llvm/include/llvm/Analysis/BlockFrequencyInfo.h index 4162734fd54..d663b09d5cf 100644 --- a/llvm/include/llvm/Analysis/BlockFrequencyInfo.h +++ b/llvm/include/llvm/Analysis/BlockFrequencyInfo.h @@ -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 { diff --git a/llvm/lib/Analysis/BlockFrequencyInfo.cpp b/llvm/lib/Analysis/BlockFrequencyInfo.cpp index fd41a6a8e20..5d2170dcf15 100644 --- a/llvm/lib/Analysis/BlockFrequencyInfo.cpp +++ b/llvm/lib/Analysis/BlockFrequencyInfo.cpp @@ -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; } diff --git a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp index 7b8e05b2ed2..d14ab9db7ec 100644 --- a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp +++ b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp @@ -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())); |

