[llvm] 93efe25 - [ViewCFG] Allow printing edge weights in debuggers

Hongtao Yu via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 26 13:18:36 PDT 2020


Author: Hongtao Yu
Date: 2020-04-26T13:18:29-07:00
New Revision: 93efe25ab386b25a04ae84f2d2019bdb0552cd2f

URL: https://github.com/llvm/llvm-project/commit/93efe25ab386b25a04ae84f2d2019bdb0552cd2f
DIFF: https://github.com/llvm/llvm-project/commit/93efe25ab386b25a04ae84f2d2019bdb0552cd2f.diff

LOG: [ViewCFG] Allow printing edge weights in debuggers

Summary:
Extending the Function::viewCFG prototypes to allow for printing block probability info in form of .dot files during debugging.

Also avoiding an AV when no BFI/BPI available.

Reviewers: wenlei, davidxl, knaumov

Reviewed By: wenlei, davidxl

Subscribers: MaskRay, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D77978

Added: 
    

Modified: 
    llvm/include/llvm/Analysis/CFGPrinter.h
    llvm/include/llvm/IR/Function.h
    llvm/lib/Analysis/CFGPrinter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Analysis/CFGPrinter.h b/llvm/include/llvm/Analysis/CFGPrinter.h
index 9f2195369a7c..c4e49ce493ea 100644
--- a/llvm/include/llvm/Analysis/CFGPrinter.h
+++ b/llvm/include/llvm/Analysis/CFGPrinter.h
@@ -64,11 +64,11 @@ class DOTFuncInfo {
   DOTFuncInfo(const Function *F) : DOTFuncInfo(F, nullptr, nullptr, 0) {}
 
   DOTFuncInfo(const Function *F, const BlockFrequencyInfo *BFI,
-              BranchProbabilityInfo *BPI, uint64_t MaxFreq)
+              const BranchProbabilityInfo *BPI, uint64_t MaxFreq)
       : F(F), BFI(BFI), BPI(BPI), MaxFreq(MaxFreq) {
     ShowHeat = false;
-    EdgeWeights = true;
-    RawWeights = true;
+    EdgeWeights = !!BPI; // Print EdgeWeights when BPI is available.
+    RawWeights = !!BFI;  // Print RawWeights when BFI is available.
   }
 
   const BlockFrequencyInfo *getBFI() { return BFI; }

diff  --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index 8d139c88a814..ee66abc3eaed 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -55,6 +55,8 @@ template <typename T> class Optional;
 class raw_ostream;
 class Type;
 class User;
+class BranchProbabilityInfo;
+class BlockFrequencyInfo;
 
 class Function : public GlobalObject, public ilist_node<Function> {
 public:
@@ -792,6 +794,10 @@ class Function : public GlobalObject, public ilist_node<Function> {
   ///
   void viewCFG() const;
 
+  /// Extended form to print edge weights.
+  void viewCFG(bool ViewCFGOnly, const BlockFrequencyInfo *BFI,
+               const BranchProbabilityInfo *BPI) const;
+
   /// viewCFGOnly - This function is meant for use from the debugger.  It works
   /// just like viewCFG, but it does not include the contents of basic blocks
   /// into the nodes, just the label.  If you are only interested in the CFG
@@ -799,6 +805,10 @@ class Function : public GlobalObject, public ilist_node<Function> {
   ///
   void viewCFGOnly() const;
 
+  /// Extended form to print edge weights.
+  void viewCFGOnly(const BlockFrequencyInfo *BFI,
+                   const BranchProbabilityInfo *BPI) const;
+
   /// Methods for support type inquiry through isa, cast, and dyn_cast:
   static bool classof(const Value *V) {
     return V->getValueID() == Value::FunctionVal;

diff  --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp
index 7856b9731753..8c8e4887ef77 100644
--- a/llvm/lib/Analysis/CFGPrinter.cpp
+++ b/llvm/lib/Analysis/CFGPrinter.cpp
@@ -77,8 +77,8 @@ static void writeCFGToDotFile(Function &F, BlockFrequencyInfo *BFI,
   errs() << "\n";
 }
 
-static void viewCFG(Function &F, BlockFrequencyInfo *BFI,
-                    BranchProbabilityInfo *BPI, uint64_t MaxFreq,
+static void viewCFG(Function &F, const BlockFrequencyInfo *BFI,
+                    const BranchProbabilityInfo *BPI, uint64_t MaxFreq,
                     bool CFGOnly = false) {
   DOTFuncInfo CFGInfo(&F, BFI, BPI, MaxFreq);
   CFGInfo.setHeatColors(ShowHeatColors);
@@ -240,11 +240,14 @@ PreservedAnalyses CFGOnlyPrinterPass::run(Function &F,
 /// program, displaying the CFG of the current function.  This depends on there
 /// being a 'dot' and 'gv' program in your path.
 ///
-void Function::viewCFG() const {
+void Function::viewCFG() const { viewCFG(false, nullptr, nullptr); }
+
+void Function::viewCFG(bool ViewCFGOnly, const BlockFrequencyInfo *BFI,
+                       const BranchProbabilityInfo *BPI) const {
   if (!CFGFuncName.empty() && !getName().contains(CFGFuncName))
     return;
-  DOTFuncInfo CFGInfo(this);
-  ViewGraph(&CFGInfo, "cfg" + getName());
+  DOTFuncInfo CFGInfo(this, BFI, BPI, BFI ? getMaxFreq(*this, BFI) : 0);
+  ViewGraph(&CFGInfo, "cfg" + getName(), ViewCFGOnly);
 }
 
 /// viewCFGOnly - This function is meant for use from the debugger.  It works
@@ -252,11 +255,11 @@ void Function::viewCFG() const {
 /// into the nodes, just the label.  If you are only interested in the CFG
 /// this can make the graph smaller.
 ///
-void Function::viewCFGOnly() const {
-  if (!CFGFuncName.empty() && !getName().contains(CFGFuncName))
-    return;
-  DOTFuncInfo CFGInfo(this);
-  ViewGraph(&CFGInfo, "cfg" + getName(), true);
+void Function::viewCFGOnly() const { viewCFGOnly(nullptr, nullptr); }
+
+void Function::viewCFGOnly(const BlockFrequencyInfo *BFI,
+                           const BranchProbabilityInfo *BPI) const {
+  viewCFG(true, BFI, BPI);
 }
 
 FunctionPass *llvm::createCFGPrinterLegacyPassPass() {


        


More information about the llvm-commits mailing list