18#ifndef LLVM_ANALYSIS_CFGPRINTER_H
19#define LLVM_ANALYSIS_CFGPRINTER_H
34class ModuleSlotTracker;
36template <
class GraphType>
struct GraphTraits;
66 std::unique_ptr<ModuleSlotTracker> MSTStorage;
90 return BFI->getBlockFreq(BB).getFrequency();
128template <
typename BasicBlockT>
130 if (!
Node->getName().empty())
131 return Node->getName().str();
140template <
typename BasicBlockT>
142 const BasicBlockT *
Node,
148 enum { MaxColumns = 80 };
151 HandleBasicBlock(
OS, *
Node);
153 if (OutStr[0] ==
'%') {
154 OutStr.erase(OutStr.begin());
157 OutStr.insert(OutStr.find_first_of(
'\n') + 1,
"\\|");
160 unsigned LastSpace = 0;
161 for (
unsigned i = 0; i != OutStr.length(); ++i) {
162 if (OutStr[i] ==
'\n') {
164 OutStr.insert(OutStr.begin() + i + 1,
'l');
167 }
else if (OutStr[i] ==
';') {
168 unsigned Idx = OutStr.find(
'\n', i + 1);
169 HandleComment(OutStr, i,
Idx);
170 }
else if (ColNum == MaxColumns) {
174 OutStr.insert(LastSpace,
"\\l...");
175 ColNum = i - LastSpace;
180 if (OutStr[i] ==
' ')
195 OutStr.erase(OutStr.begin() +
I, OutStr.begin() +
Idx);
210 HandleBasicBlock = {},
211 function_ref<void(std::string &,
unsigned &,
unsigned)> HandleComment =
217 return getSimpleNodeLabel(
Node, CFGInfo);
219 return getCompleteNodeLabel(
Node, CFGInfo);
225 if (
const BranchInst *BI = dyn_cast<BranchInst>(
Node->getTerminator()))
226 if (BI->isConditional())
231 unsigned SuccNo =
I.getSuccessorIndex();
239 OS << Case.getCaseValue()->getValue();
246 std::string NodeName =
Node->getName().str();
247 if (NodeName.empty()) {
251 NodeName.erase(NodeName.begin());
263 unsigned OpNo =
I.getSuccessorIndex();
267 double WeightPercent = ((double)BranchProb.getNumerator()) /
268 ((
double)BranchProb.getDenominator());
270 formatv(
"tooltip=\"{0} -> {1}\\nProbability {2:P}\" ", getBBName(
Node),
271 getBBName(SuccBB), WeightPercent);
274 return TTAttr +
"penwidth=2";
279 double Width = 1 + WeightPercent;
283 formatv(
"label=\"{0:P}\" penwidth={1}", WeightPercent, Width)
291 TTAttr +
formatv(
"label=\"W:{0}\" penwidth={1}",
292 (
uint64_t)(Freq * WeightPercent), Width)
301 OpNo =
I.getSuccessorIndex() + 1;
305 mdconst::dyn_extract<ConstantInt>(WeightsNode->
getOperand(OpNo));
308 return (TTAttr +
"label=\"W:" + std::to_string(Weight->
getZExtValue()) +
309 "\" penwidth=" + std::to_string(Width));
319 std::string EdgeColor = (Freq <= (CFGInfo->
getMaxFreq() / 2))
323 std::string Attrs =
"color=\"" + EdgeColor +
"ff\", style=filled," +
324 " fillcolor=\"" + Color +
"70\"" +
325 " fontname=\"Courier\"";
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
This file contains the declarations for profiling metadata utility functions.
static bool isSimple(Instruction *I)
void printAsOperand(OutputBuffer &OB, Prec P=Prec::Default, bool StrictlyWorse=false) const
A container for analyses that lazily runs them and caches their results.
LLVM Basic Block Representation.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Conditional or Unconditional Branch instruction.
Analysis providing branch probability information.
BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const
Get an edge's probability, relative to other out-edges of the Src.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
This is the shared class of boolean and integer constants.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
void setRawEdgeWeights(bool RawWeights)
uint64_t getMaxFreq() const
void setEdgeWeights(bool EdgeWeights)
DOTFuncInfo(const Function *F)
uint64_t getFreq(const BasicBlock *BB) const
const BranchProbabilityInfo * getBPI() const
ModuleSlotTracker * getModuleSlotTracker()
const Function * getFunction() const
const BlockFrequencyInfo * getBFI() const
void setHeatColors(bool ShowHeat)
const BasicBlock & getEntryBlock() const
unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
const MDOperand & getOperand(unsigned I) const
unsigned getNumOperands() const
Return number of MDNode operands.
Manage lifetime of a slot tracker for printing IR.
A set of analyses that are preserved following a run of a transformation pass.
std::string str() const
str - Get the contents as an std::string.
static CaseIteratorImpl fromSuccessorIndex(SwitchInstT *SI, unsigned SuccessorIndex)
Initializes case iterator for given SwitchInst and for given successor index.
StringRef getName() const
Return a constant reference to the value's name.
An efficient, type-erasing, non-owning reference to a callable.
A raw_ostream that writes to an std::string.
This is an optimization pass for GlobalISel generic memory operations.
MDNode * getBranchWeightMDNode(const Instruction &I)
Get the branch weights metadata node.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
std::string SimpleNodeLabelString(const BasicBlockT *Node)
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
std::string getHeatColor(uint64_t freq, uint64_t maxFreq)
std::string CompleteNodeLabelString(const BasicBlockT *Node, function_ref< void(raw_string_ostream &, const BasicBlockT &)> HandleBasicBlock, function_ref< void(std::string &, unsigned &, unsigned)> HandleComment)
std::string getEdgeAttributes(const BasicBlock *Node, const_succ_iterator I, DOTFuncInfo *CFGInfo)
Display the raw branch weights from PGO.
void computeDeoptOrUnreachablePaths(const Function *F)
static std::string getSimpleNodeLabel(const BasicBlock *Node, DOTFuncInfo *)
static std::string getGraphName(DOTFuncInfo *CFGInfo)
DenseMap< const BasicBlock *, bool > isOnDeoptOrUnreachablePath
static std::string getCompleteNodeLabel(const BasicBlock *Node, DOTFuncInfo *, function_ref< void(raw_string_ostream &, const BasicBlock &)> HandleBasicBlock={}, function_ref< void(std::string &, unsigned &, unsigned)> HandleComment=eraseComment)
bool isNodeHidden(const BasicBlock *Node, const DOTFuncInfo *CFGInfo)
DOTGraphTraits(bool isSimple=false)
std::string getNodeAttributes(const BasicBlock *Node, DOTFuncInfo *CFGInfo)
static std::string getEdgeSourceLabel(const BasicBlock *Node, const_succ_iterator I)
static void eraseComment(std::string &OutStr, unsigned &I, unsigned Idx)
std::string getNodeLabel(const BasicBlock *Node, DOTFuncInfo *CFGInfo)
static std::string getBBName(const BasicBlock *Node)
DOTGraphTraits - Template class that can be specialized to customize how graphs are converted to 'dot...
DefaultDOTGraphTraits - This class provides the default implementations of all of the DOTGraphTraits ...
static nodes_iterator nodes_begin(DOTFuncInfo *CFGInfo)
static size_t size(DOTFuncInfo *CFGInfo)
static NodeRef getEntryNode(DOTFuncInfo *CFGInfo)
static nodes_iterator nodes_end(DOTFuncInfo *CFGInfo)
A CRTP mix-in to automatically provide informational APIs needed for passes.