LLVM 20.0.0git
|
This abstract builder class defines a set of high-level steps for creating DDG-like graphs. More...
#include "llvm/Analysis/DependenceGraphBuilder.h"
Public Types | |
using | ClassesType = EquivalenceClasses< BasicBlock * > |
using | NodeListType = SmallVector< NodeType *, 4 > |
Public Member Functions | |
AbstractDependenceGraphBuilder (GraphType &G, DependenceInfo &D, const BasicBlockListType &BBs) | |
virtual | ~AbstractDependenceGraphBuilder ()=default |
void | populate () |
The main entry to the graph construction algorithm. | |
void | computeInstructionOrdinals () |
Compute ordinal numbers for each instruction and store them in a map for future look up. | |
void | createFineGrainedNodes () |
Create fine grained nodes. | |
void | createDefUseEdges () |
Analyze the def-use chains and create edges from the nodes containing definitions to the nodes containing the uses. | |
void | createMemoryDependencyEdges () |
Analyze data dependencies that exist between memory loads or stores, in the graph nodes and create edges between them. | |
void | createAndConnectRootNode () |
Create a root node and add edges such that each node in the graph is reachable from the root. | |
void | createPiBlocks () |
Apply graph abstraction to groups of nodes that belong to a strongly connected component of the graph to create larger compound nodes called pi-blocks. | |
void | simplify () |
Go through all the nodes in the graph and collapse any two nodes 'a' and 'b' if all of the following are true: | |
void | sortNodesTopologically () |
Topologically sort the graph nodes. | |
Protected Types | |
using | BasicBlockListType = SmallVectorImpl< BasicBlock * > |
using | InstToNodeMap = DenseMap< Instruction *, NodeType * > |
Map types to map instructions to nodes used when populating the graph. | |
using | InstToOrdinalMap = DenseMap< Instruction *, size_t > |
Map Types to map instruction/nodes to an ordinal number. | |
using | NodeToOrdinalMap = DenseMap< NodeType *, size_t > |
Protected Member Functions | |
virtual NodeType & | createRootNode ()=0 |
Create the root node of the graph. | |
virtual NodeType & | createFineGrainedNode (Instruction &I)=0 |
Create an atomic node in the graph given a single instruction. | |
virtual NodeType & | createPiBlock (const NodeListType &L)=0 |
Create a pi-block node in the graph representing a group of nodes in an SCC of the graph. | |
virtual EdgeType & | createDefUseEdge (NodeType &Src, NodeType &Tgt)=0 |
Create a def-use edge going from Src to Tgt . | |
virtual EdgeType & | createMemoryEdge (NodeType &Src, NodeType &Tgt)=0 |
Create a memory dependence edge going from Src to Tgt . | |
virtual EdgeType & | createRootedEdge (NodeType &Src, NodeType &Tgt)=0 |
Create a rooted edge going from Src to Tgt . | |
virtual const NodeListType & | getNodesInPiBlock (const NodeType &N)=0 |
Given a pi-block node, return a vector of all the nodes contained within it. | |
virtual void | destroyEdge (EdgeType &E) |
Deallocate memory of edge E . | |
virtual void | destroyNode (NodeType &N) |
Deallocate memory of node N . | |
virtual bool | shouldCreatePiBlocks () const |
Return true if creation of pi-blocks are supported and desired, and false otherwise. | |
virtual bool | shouldSimplify () const |
Return true if graph simplification step is requested, and false otherwise. | |
virtual bool | areNodesMergeable (const NodeType &A, const NodeType &B) const =0 |
Return true if it's safe to merge the two nodes. | |
virtual void | mergeNodes (NodeType &A, NodeType &B)=0 |
Append the content of node B into node A and remove B and the edge between A and B from the graph. | |
size_t | getOrdinal (Instruction &I) |
Given an instruction I return its associated ordinal number. | |
size_t | getOrdinal (NodeType &N) |
Given a node N return its associated ordinal number. | |
Protected Attributes | |
GraphType & | Graph |
Reference to the graph that gets built by a concrete implementation of this builder. | |
DependenceInfo & | DI |
Dependence information used to create memory dependence edges in the graph. | |
const BasicBlockListType & | BBList |
The list of basic blocks to consider when building the graph. | |
InstToNodeMap | IMap |
A mapping from instructions to the corresponding nodes in the graph. | |
InstToOrdinalMap | InstOrdinalMap |
A mapping from each instruction to an ordinal number. | |
NodeToOrdinalMap | NodeOrdinalMap |
A mapping from nodes to an ordinal number. | |
This abstract builder class defines a set of high-level steps for creating DDG-like graphs.
The client code is expected to inherit from this class and define concrete implementation for each of the pure virtual functions used in the high-level algorithm.
Definition at line 31 of file DependenceGraphBuilder.h.
|
protected |
Definition at line 33 of file DependenceGraphBuilder.h.
using llvm::AbstractDependenceGraphBuilder< GraphType >::ClassesType = EquivalenceClasses<BasicBlock *> |
Definition at line 40 of file DependenceGraphBuilder.h.
|
protected |
Map types to map instructions to nodes used when populating the graph.
Definition at line 171 of file DependenceGraphBuilder.h.
|
protected |
Map Types to map instruction/nodes to an ordinal number.
Definition at line 174 of file DependenceGraphBuilder.h.
using llvm::AbstractDependenceGraphBuilder< GraphType >::NodeListType = SmallVector<NodeType *, 4> |
Definition at line 41 of file DependenceGraphBuilder.h.
|
protected |
Definition at line 175 of file DependenceGraphBuilder.h.
|
inline |
Definition at line 43 of file DependenceGraphBuilder.h.
|
virtualdefault |
|
protectedpure virtual |
Return true if it's safe to merge the two nodes.
void AbstractDependenceGraphBuilder::computeInstructionOrdinals |
Compute ordinal numbers for each instruction and store them in a map for future look up.
These ordinals are used to compute node ordinals which are in turn used to order nodes that are part of a cycle. Instruction ordinals are assigned based on lexical program order.
Definition at line 42 of file DependenceGraphBuilder.cpp.
References I.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
void AbstractDependenceGraphBuilder::createAndConnectRootNode |
Create a root node and add edges such that each node in the graph is reachable from the root.
Definition at line 64 of file DependenceGraphBuilder.cpp.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
|
protectedpure virtual |
Create a def-use edge going from Src
to Tgt
.
void AbstractDependenceGraphBuilder::createDefUseEdges |
Analyze the def-use chains and create edges from the nodes containing definitions to the nodes containing the uses.
Definition at line 228 of file DependenceGraphBuilder.cpp.
References llvm::dbgs(), I, II, llvm::SmallPtrSetImpl< PtrType >::insert(), LLVM_DEBUG, and N.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
|
protectedpure virtual |
Create an atomic node in the graph given a single instruction.
Implemented in llvm::DDGBuilder.
void AbstractDependenceGraphBuilder::createFineGrainedNodes |
Create fine grained nodes.
These are typically atomic nodes that consist of a single instruction.
Definition at line 51 of file DependenceGraphBuilder.cpp.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
void AbstractDependenceGraphBuilder::createMemoryDependencyEdges |
Analyze data dependencies that exist between memory loads or stores, in the graph nodes and create edges between them.
Definition at line 278 of file DependenceGraphBuilder.cpp.
References D, llvm::SmallVectorBase< Size_T >::empty(), llvm::Dependence::DVEntry::EQ, llvm::Dependence::DVEntry::GT, I, and llvm::Dependence::DVEntry::LT.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
|
protectedpure virtual |
Create a memory dependence edge going from Src
to Tgt
.
|
protectedpure virtual |
Create a pi-block node in the graph representing a group of nodes in an SCC of the graph.
Implemented in llvm::DDGBuilder.
void AbstractDependenceGraphBuilder::createPiBlocks |
Apply graph abstraction to groups of nodes that belong to a strongly connected component of the graph to create larger compound nodes called pi-blocks.
The purpose of this abstraction is to isolate sets of program elements that need to stay together during codegen and turn the dependence graph into an acyclic graph.
Definition at line 91 of file DependenceGraphBuilder.cpp.
References llvm::dbgs(), and LLVM_DEBUG.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
|
protectedpure virtual |
Create a rooted edge going from Src
to Tgt
.
|
protectedpure virtual |
Create the root node of the graph.
Implemented in llvm::DDGBuilder.
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
protectedpure virtual |
Given a pi-block node, return a vector of all the nodes contained within it.
|
inlineprotected |
Given an instruction I
return its associated ordinal number.
Definition at line 158 of file DependenceGraphBuilder.h.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::contains(), I, and llvm::AbstractDependenceGraphBuilder< GraphType >::InstOrdinalMap.
|
inlineprotected |
Given a node N
return its associated ordinal number.
Definition at line 165 of file DependenceGraphBuilder.h.
References assert(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::contains(), N, and llvm::AbstractDependenceGraphBuilder< GraphType >::NodeOrdinalMap.
|
protectedpure virtual |
Append the content of node B
into node A
and remove B
and the edge between A
and B
from the graph.
|
inline |
The main entry to the graph construction algorithm.
It starts by creating nodes in increasing order of granularity and then adds def-use and memory edges. As one of the final stages, it also creates pi-block nodes to facilitate codegen in transformations that use dependence graphs.
The algorithmic complexity of this implementation is O(V^2 * I^2), where V is the number of vertecies (nodes) and I is the number of instructions in each node. The total number of instructions, N, is equal to V * I, therefore the worst-case time complexity is O(N^2). The average time complexity is O((N^2)/2).
Definition at line 59 of file DependenceGraphBuilder.h.
References llvm::AbstractDependenceGraphBuilder< GraphType >::computeInstructionOrdinals(), llvm::AbstractDependenceGraphBuilder< GraphType >::createAndConnectRootNode(), llvm::AbstractDependenceGraphBuilder< GraphType >::createDefUseEdges(), llvm::AbstractDependenceGraphBuilder< GraphType >::createFineGrainedNodes(), llvm::AbstractDependenceGraphBuilder< GraphType >::createMemoryDependencyEdges(), llvm::AbstractDependenceGraphBuilder< GraphType >::createPiBlocks(), llvm::AbstractDependenceGraphBuilder< GraphType >::simplify(), and llvm::AbstractDependenceGraphBuilder< GraphType >::sortNodesTopologically().
|
inlineprotectedvirtual |
Return true if creation of pi-blocks are supported and desired, and false otherwise.
Reimplemented in llvm::DDGBuilder.
Definition at line 143 of file DependenceGraphBuilder.h.
|
inlineprotectedvirtual |
Return true if graph simplification step is requested, and false otherwise.
Reimplemented in llvm::DDGBuilder.
Definition at line 147 of file DependenceGraphBuilder.h.
void AbstractDependenceGraphBuilder::simplify |
Go through all the nodes in the graph and collapse any two nodes 'a' and 'b' if all of the following are true:
Definition at line 378 of file DependenceGraphBuilder.cpp.
References assert(), llvm::SmallPtrSetImpl< PtrType >::begin(), llvm::dbgs(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::SmallPtrSetImpl< PtrType >::end(), llvm::SmallPtrSetImpl< PtrType >::erase(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), I, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), LLVM_DEBUG, N, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::size(), and llvm::SmallPtrSetImplBase::size().
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
void AbstractDependenceGraphBuilder::sortNodesTopologically |
Topologically sort the graph nodes.
Definition at line 482 of file DependenceGraphBuilder.cpp.
References llvm::append_range(), assert(), N, llvm::post_order(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::reverse().
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::populate().
|
protected |
The list of basic blocks to consider when building the graph.
Definition at line 186 of file DependenceGraphBuilder.h.
|
protected |
Dependence information used to create memory dependence edges in the graph.
Definition at line 183 of file DependenceGraphBuilder.h.
|
protected |
Reference to the graph that gets built by a concrete implementation of this builder.
Definition at line 179 of file DependenceGraphBuilder.h.
|
protected |
A mapping from instructions to the corresponding nodes in the graph.
Definition at line 189 of file DependenceGraphBuilder.h.
|
protected |
A mapping from each instruction to an ordinal number.
This map is used to populate the NodeOrdinalMap
.
Definition at line 193 of file DependenceGraphBuilder.h.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::getOrdinal().
|
protected |
A mapping from nodes to an ordinal number.
This map is used to sort nodes in a pi-block based on program order.
Definition at line 197 of file DependenceGraphBuilder.h.
Referenced by llvm::AbstractDependenceGraphBuilder< GraphType >::getOrdinal().