diff --git a/llvm/include/llvm/Analysis/CFGPrinter.h b/llvm/include/llvm/Analysis/CFGPrinter.h --- a/llvm/include/llvm/Analysis/CFGPrinter.h +++ b/llvm/include/llvm/Analysis/CFGPrinter.h @@ -67,8 +67,8 @@ BranchProbabilityInfo *BPI, uint64_t MaxFreq) : F(F), BFI(BFI), BPI(BPI), MaxFreq(MaxFreq) { ShowHeat = false; - EdgeWeights = true; - RawWeights = true; + EdgeWeights = !!BPI; // Don't print EdgeWeights when no 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 --- a/llvm/include/llvm/IR/Function.h +++ b/llvm/include/llvm/IR/Function.h @@ -55,6 +55,8 @@ class raw_ostream; class Type; class User; +class BranchProbabilityInfo; +class BlockFrequencyInfo; class Function : public GlobalObject, public ilist_node { public: @@ -792,6 +794,10 @@ /// void viewCFG() const; + /// Extended form to print edge weights. + void viewCFG(bool viewCFGOnly, BlockFrequencyInfo *BFI, + 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,9 @@ /// void viewCFGOnly() const; + /// Extended form to print edge weights. + void viewCFGOnly(BlockFrequencyInfo *BFI, 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 --- a/llvm/lib/Analysis/CFGPrinter.cpp +++ b/llvm/lib/Analysis/CFGPrinter.cpp @@ -240,11 +240,14 @@ /// 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, BlockFrequencyInfo *BFI, + 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 @@ /// 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(BlockFrequencyInfo *BFI, + BranchProbabilityInfo *BPI) const { + viewCFG(true, BFI, BPI); } FunctionPass *llvm::createCFGPrinterLegacyPassPass() {