[llvm] r313159 - Add options to dump PGO counts in text.

Hiroshi Yamauchi via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 13 10:20:38 PDT 2017


Author: yamauchi
Date: Wed Sep 13 10:20:38 2017
New Revision: 313159

URL: http://llvm.org/viewvc/llvm-project?rev=313159&view=rev
Log:
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

Modified:
    llvm/trunk/include/llvm/Analysis/BlockFrequencyInfo.h
    llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp
    llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp

Modified: llvm/trunk/include/llvm/Analysis/BlockFrequencyInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BlockFrequencyInfo.h?rev=313159&r1=313158&r2=313159&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/BlockFrequencyInfo.h (original)
+++ llvm/trunk/include/llvm/Analysis/BlockFrequencyInfo.h Wed Sep 13 10:20:38 2017
@@ -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 {

Modified: llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp?rev=313159&r1=313158&r2=313159&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp Wed Sep 13 10:20:38 2017
@@ -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> PrintBlockFreqFuncN
 namespace llvm {
 
 static GVDAGType getGVDT() {
-  if (PGOViewCounts)
+  if (PGOViewCounts == PGOVCT_Graph)
     return GVDT_Count;
   return ViewBlockFreqPropagationDAG;
 }

Modified: llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp?rev=313159&r1=313158&r2=313159&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp Wed Sep 13 10:20:38 2017
@@ -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()));




More information about the llvm-commits mailing list