diff --git a/llvm/include/llvm/Analysis/CFGPrinter.h b/llvm/include/llvm/Analysis/CFGPrinter.h index 9f2195369a7ca4..c4e49ce493ea08 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 8d139c88a8143e..ee66abc3eaed64 100644 --- a/llvm/include/llvm/IR/Function.h +++ b/llvm/include/llvm/IR/Function.h @@ -55,6 +55,8 @@ template class Optional; class raw_ostream; class Type; class User; +class BranchProbabilityInfo; +class BlockFrequencyInfo; class Function : public GlobalObject, public ilist_node { public: @@ -792,6 +794,10 @@ class Function : public GlobalObject, public ilist_node { /// 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 { /// 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 7856b9731753bf..8c8e4887ef77fc 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() {