25 cl::desc(
"The prefix used for the DDG dot file names."));
52 errs() <<
" error opening file for writing!";
59std::string DDGDotGraphTraits::getNodeLabel(
const DDGNode *Node,
62 return getSimpleNodeLabel(Node, Graph);
64 return getVerboseNodeLabel(Node, Graph);
67std::string DDGDotGraphTraits::getEdgeAttributes(
70 const DDGEdge *
E =
static_cast<const DDGEdge *
>(*
I.getCurrent());
72 return getSimpleEdgeAttributes(Node,
E,
G);
74 return getVerboseEdgeAttributes(Node,
E,
G);
77bool DDGDotGraphTraits::isNodeHidden(
const DDGNode *Node,
81 assert(Graph &&
"expected a valid graph pointer");
85std::string DDGDotGraphTraits::getNodeAttributes(
const DDGNode *Node,
88 return "shape=box, style=\"rounded,filled\", fillcolor=lightyellow, "
89 "color=darkorange, penwidth=3";
92 return "style=filled, fillcolor=lightcyan";
97DDGDotGraphTraits::getSimpleNodeLabel(
const DDGNode *Node,
100 raw_string_ostream OS(Str);
102 for (
auto *
II :
static_cast<const SimpleDDGNode *
>(Node)->getInstructions())
105 OS <<
"pi-block\nwith\n"
115DDGDotGraphTraits::getVerboseNodeLabel(
const DDGNode *Node,
118 raw_string_ostream OS(Str);
119 OS <<
"<kind:" <<
Node->getKind() <<
">\n";
121 for (
auto *
II :
static_cast<const SimpleDDGNode *
>(Node)->getInstructions())
124 OS <<
"--- start of nodes in pi-block ---\n";
127 for (
auto *PN : PNodes) {
128 OS << getVerboseNodeLabel(PN,
G);
129 if (++
Count != PNodes.size())
132 OS <<
"--- end of nodes in pi-block ---\n";
148 OS <<
", color=blue";
151std::string DDGDotGraphTraits::getSimpleEdgeAttributes(
154 raw_string_ostream OS(Str);
156 OS <<
"label=\"[" <<
Kind <<
"]\"";
161std::string DDGDotGraphTraits::getVerboseEdgeAttributes(
164 raw_string_ostream OS(Str);
168 OS <<
G->getDependenceString(*Src,
Edge->getTargetNode());
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static void writeDDGToDotFile(DataDependenceGraph &G, bool DOnly=false)
static void writeEdgeKindColorAttr(raw_ostream &OS, DDGEdge::EdgeKind Kind)
EdgeKind to DOT color mapping:
static cl::opt< bool > DotOnly("dot-ddg-only", cl::Hidden, cl::desc("simple ddg dot graph"))
static cl::opt< std::string > DDGDotFilenamePrefix("dot-ddg-filename-prefix", cl::init("ddg"), cl::Hidden, cl::desc("The prefix used for the DDG dot file names."))
uint64_t IntrinsicInst * II
static constexpr StringLiteral Filename
std::pair< BasicBlock *, BasicBlock * > Edge
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Analysis pass that builds the DDG for a loop.
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Data Dependency Graph Edge.
EdgeKind
The kind of edge in the DDG.
Data Dependence Graph Node The graph can represent the following types of nodes:
const PiBlockDDGNode * getPiBlock(const NodeType &N) const
If node N belongs to a pi-block return a pointer to the pi-block, otherwise return null.
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
Represents a single loop in the control flow graph.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
A raw_ostream that writes to a file descriptor.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
NodeAddr< NodeBase * > Node
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
This is an optimization pass for GlobalISel generic memory operations.
raw_ostream & WriteGraph(raw_ostream &O, const GraphType &G, bool ShortNames=false, const Twine &Title="")
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
FunctionAddr VTableAddr Count
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...