Index: llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp =================================================================== --- llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp +++ llvm/trunk/lib/Analysis/BlockFrequencyInfo.cpp @@ -55,8 +55,18 @@ "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 PGOViewCounts("pgo-view-counts", cl::init(false), cl::Hidden); + namespace llvm { +static GVDAGType getGVDT() { + + if (PGOViewCounts) + return GVDT_Count; + return ViewBlockFreqPropagationDAG; +} + template <> struct GraphTraits { typedef const BasicBlock *NodeRef; @@ -89,8 +99,7 @@ std::string getNodeLabel(const BasicBlock *Node, const BlockFrequencyInfo *Graph) { - return BFIDOTGTraitsBase::getNodeLabel(Node, Graph, - ViewBlockFreqPropagationDAG); + return BFIDOTGTraitsBase::getNodeLabel(Node, Graph, getGVDT()); } std::string getNodeAttributes(const BasicBlock *Node, Index: llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp =================================================================== --- llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp +++ llvm/trunk/lib/Transforms/Instrumentation/PGOInstrumentation.cpp @@ -58,7 +58,9 @@ #include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/CFG.h" #include "llvm/Analysis/IndirectCallSiteVisitor.h" +#include "llvm/Analysis/LoopInfo.h" #include "llvm/IR/CallSite.h" +#include "llvm/IR/Dominators.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/IRBuilder.h" @@ -143,6 +145,17 @@ // Command line option to enable/disable select instruction instrumentation. static cl::opt PGOInstrSelect("pgo-instr-select", cl::init(true), cl::Hidden); + +// Command line option to specify the name of the function for CFG dump +static cl::opt + PGOViewFunction("pgo-view-function", cl::Hidden, + cl::desc("The option to specify " + "the name of the function " + "whose CFG will be displayed.")); + +// Command line option to turn on CFG dot dump after profile annotation. +extern cl::opt PGOViewCounts; + namespace { /// The select instruction visitor plays three roles specified @@ -1202,6 +1215,18 @@ ColdFunctions.push_back(&F); else if (FreqAttr == PGOUseFunc::FFA_Hot) HotFunctions.push_back(&F); +#ifndef NDEBUG + if (PGOViewCounts && + (PGOViewFunction.empty() || F.getName().equals(PGOViewFunction))) { + LoopInfo LI{DominatorTree(F)}; + std::unique_ptr NewBPI = + llvm::make_unique(F, LI); + std::unique_ptr NewBFI = + llvm::make_unique(F, *NewBPI, LI); + + NewBFI->view(); + } +#endif } M.setProfileSummary(PGOReader->getSummary().getMD(M.getContext())); // Set function hotness attribute from the profile.