27 #define DEBUG_TYPE "block-freq"
31 "view-block-freq-propagation-dags",
cl::Hidden,
32 cl::desc(
"Pop up a window to show a dag displaying how block "
33 "frequencies propagation through the CFG."),
36 "display a graph using the "
37 "fractional block frequency representation."),
39 "display a graph using the raw "
40 "integer fractional block frequency representation."),
42 "profile count if available.")));
47 "the name of the function "
48 "whose CFG will be displayed."));
52 cl::desc(
"An integer in percent used to specify "
53 "the hot blocks/edges to be displayed "
54 "in red: a block or edge whose frequency "
55 "is no less than the max frequency of the "
56 "function multiplied by this percent."));
121 :
BFI(std::move(Arg.
BFI)) {}
125 BFI = std::move(RHS.BFI);
140 BFI->calculate(F, BPI, LI);
151 return BFI ?
BFI->getBlockFreq(BB) : 0;
170 assert(
BFI &&
"Expected analysis to be available");
171 BFI->setBlockFreq(BB, Freq);
179 ViewGraph(const_cast<BlockFrequencyInfo *>(
this),
"BlockFrequencyDAGs");
181 errs() <<
"BlockFrequencyInfo::view is only available in debug builds on "
182 "systems with Graphviz or gv!\n";
187 return BFI ?
BFI->getFunction() :
nullptr;
191 return BFI ? &
BFI->getBPI() :
nullptr;
196 return BFI ?
BFI->printBlockFreq(OS, Freq) : OS;
202 return BFI ?
BFI->printBlockFreq(OS, BB) : OS;
206 return BFI ?
BFI->getEntryFreq() : 0;
218 "Block Frequency Analysis",
true,
true)
224 char BlockFrequencyInfoWrapperPass::
ID = 0;
227 BlockFrequencyInfoWrapperPass::BlockFrequencyInfoWrapperPass()
249 getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI();
250 LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
251 BFI.calculate(F, BPI, LI);
266 OS <<
"Printing analysis results of BFI for function "
static NodeRef getEntryNode(const BlockFrequencyInfo *G)
Result run(Function &F, FunctionAnalysisManager &AM)
Run the analysis pass over a function and produce BFI.
block Block Frequency true
cl::opt< unsigned > ViewHotFreqPercent("view-hot-freq-percent", cl::init(10), cl::Hidden, cl::desc("An integer in percent used to specify ""the hot blocks/edges to be displayed ""in red: a block or edge whose frequency ""is no less than the max frequency of the ""function multiplied by this percent."))
std::string getNodeLabel(const BasicBlock *Node, const BlockFrequencyInfo *Graph)
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
raw_ostream & printBlockFreq(raw_ostream &OS, const BlockFrequency Freq) const
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A Module instance is used to store all the information related to an LLVM module. ...
DOTGraphTraits(bool isSimple=false)
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
succ_const_iterator ChildIteratorType
void releaseMemory() override
releaseMemory() - This member can be implemented by a pass if it wants to be able to release its memo...
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
~BlockFrequencyInfoWrapperPass() override
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass...
StringRef getName() const
Return a constant reference to the value's name.
AnalysisUsage & addRequired()
#define INITIALIZE_PASS_DEPENDENCY(depName)
void initializeBlockFrequencyInfoWrapperPassPass(PassRegistry &)
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool equals(StringRef RHS) const
equals - Check for string equality, this is more efficient than compare() when the relative ordering ...
Legacy analysis pass which computes BlockFrequencyInfo.
Analysis pass that exposes the LoopInfo for a function.
std::string getNodeAttributes(const BasicBlock *Node, const BlockFrequencyInfo *Graph)
Interval::succ_iterator succ_begin(Interval *I)
succ_begin/succ_end - define methods so that Intervals may be used just like BasicBlocks can with the...
static bool isSimple(Instruction *I)
Analysis pass which computes BranchProbabilityInfo.
static nodes_iterator nodes_begin(const BlockFrequencyInfo *G)
Optional< uint64_t > getProfileCountFromFreq(uint64_t Freq) const
Returns the estimated profile count of Freq.
static ChildIteratorType child_end(const NodeRef N)
std::string getNodeLabel(NodeRef Node, const BlockFrequencyInfoT *Graph, GVDAGType GType)
Legacy analysis pass which computes BranchProbabilityInfo.
Interval::succ_iterator succ_end(Interval *I)
ValuesClass values(OptsTy...Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
initializer< Ty > init(const Ty &Val)
A set of analyses that are preserved following a run of a transformation pass.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs...ExtraArgs)
Get the result of an analysis pass for a given IR unit.
LLVM Basic Block Representation.
pointer_iterator< Function::const_iterator > nodes_iterator
static ChildIteratorType child_begin(const NodeRef N)
void calculate(const Function &F, const BranchProbabilityInfo &BPI, const LoopInfo &LI)
calculate - compute block frequency info for the given function.
Represent the analysis usage information of a pass.
INITIALIZE_PASS_END(RegBankSelect, DEBUG_TYPE,"Assign register bank of generic virtual registers", false, false) RegBankSelect
FunctionPass class - This class is used to implement most global optimizations.
BFIDOTGraphTraitsBase< BlockFrequencyInfo, BranchProbabilityInfo > BFIDOTGTraitsBase
void ViewGraph(const GraphType &G, const Twine &Name, bool ShortNames=false, const Twine &Title="", GraphProgram::Name Program=GraphProgram::DOT)
ViewGraph - Emit a dot graph, run 'dot', run gv on the postscript file, then cleanup.
uint64_t getEntryFreq() const
const BasicBlock * NodeRef
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
std::string getEdgeAttributes(NodeRef Node, EdgeIter EI, const BlockFrequencyInfoT *BFI, const BranchProbabilityInfoT *BPI, unsigned HotPercentThreshold=0)
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
std::string getNodeAttributes(NodeRef Node, const BlockFrequencyInfoT *Graph, unsigned HotPercentThreshold=0)
std::string getEdgeAttributes(const BasicBlock *Node, EdgeIter EI, const BlockFrequencyInfo *BFI)
Analysis pass which computes BlockFrequencyInfo.
GTraits::ChildIteratorType EdgeIter
void setBlockFreq(const BasicBlock *BB, uint64_t Freq)
void print(raw_ostream &OS) const
const BranchProbabilityInfo * getBPI() const
void setPreservesAll()
Set by analyses that do not transform their input at all.
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Analysis providing branch probability information.
block Block Frequency Analysis
const Function * getFunction() const
INITIALIZE_PASS_BEGIN(BlockFrequencyInfoWrapperPass,"block-freq","Block Frequency Analysis", true, true) INITIALIZE_PASS_END(BlockFrequencyInfoWrapperPass
cl::opt< std::string > ViewBlockFreqFuncName("view-bfi-func-name", cl::Hidden, cl::desc("The option to specify ""the name of the function ""whose CFG will be displayed."))
void view() const
Pop up a ghostview window with the current block frequency propagation rendered using dot...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
const BasicBlock & front() const
static cl::opt< GVDAGType > ViewBlockFreqPropagationDAG("view-block-freq-propagation-dags", cl::Hidden, cl::desc("Pop up a window to show a dag displaying how block ""frequencies propagation through the CFG."), cl::values(clEnumValN(GVDT_None,"none","do not display graphs."), clEnumValN(GVDT_Fraction,"fraction","display a graph using the ""fractional block frequency representation."), clEnumValN(GVDT_Integer,"integer","display a graph using the raw ""integer fractional block frequency representation."), clEnumValN(GVDT_Count,"count","display a graph using the real ""profile count if available.")))
void print(raw_ostream &OS, const Module *M) const override
print - Print out the internal state of the pass.
This class implements an extremely fast bulk output stream that can only output to a stream...
The legacy pass manager's analysis pass to compute loop information.
Shared implementation for block frequency analysis.
A container for analyses that lazily runs them and caches their results.
Optional< uint64_t > getBlockProfileCount(const BasicBlock *BB) const
Returns the estimated profile count of BB.
A special type used by analysis passes to provide an address that identifies that particular analysis...
BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
static nodes_iterator nodes_end(const BlockFrequencyInfo *G)