From: Xinliang David Li Date: Mon, 23 Jan 2017 18:58:24 +0000 (+0000) Subject: [PGO] add debug option to view annotated cfg after prof use annotation X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=83c73f565d990f9aa3c6f6e7861e16639b4da9a5;p=llvm [PGO] add debug option to view annotated cfg after prof use annotation Differential Revision: http://reviews.llvm.org/D28967 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292815 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/BlockFrequencyInfo.cpp b/lib/Analysis/BlockFrequencyInfo.cpp index 1c4e28f20ca..3c57c171e07 100644 --- a/lib/Analysis/BlockFrequencyInfo.cpp +++ b/lib/Analysis/BlockFrequencyInfo.cpp @@ -55,8 +55,18 @@ cl::opt "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 @@ struct DOTGraphTraits : public BFIDOTGTraitsBase { 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, diff --git a/lib/Transforms/Instrumentation/PGOInstrumentation.cpp b/lib/Transforms/Instrumentation/PGOInstrumentation.cpp index 04f9a64bef9..05cecc8e050 100644 --- a/lib/Transforms/Instrumentation/PGOInstrumentation.cpp +++ b/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 @@ static cl::opt NoPGOWarnMismatchComdat("no-pgo-warn-mismatch-comdat", // 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 @@ static bool annotateAllFunctions( 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.