mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-01 18:33:56 +00:00
R600/structurizer: add class to find the Nearest Common Dominator
This is a candidate for the stable branch. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Tom Stellard <thomas.stellard@amd.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175345 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
55ba691dce
commit
f0e469bcaf
@ -39,6 +39,7 @@ typedef SmallVector<BBValuePair, 2> BBValueVector;
|
||||
typedef SmallPtrSet<BasicBlock *, 8> BBSet;
|
||||
|
||||
typedef DenseMap<PHINode *, BBValueVector> PhiMap;
|
||||
typedef DenseMap<DomTreeNode *, unsigned> DTN2UnsignedMap;
|
||||
typedef DenseMap<BasicBlock *, PhiMap> BBPhiMap;
|
||||
typedef DenseMap<BasicBlock *, Value *> BBPredicates;
|
||||
typedef DenseMap<BasicBlock *, BBPredicates> PredMap;
|
||||
@ -48,6 +49,71 @@ typedef DenseMap<BasicBlock *, BBVector> BB2BBVecMap;
|
||||
|
||||
static const char *FlowBlockName = "Flow";
|
||||
|
||||
/// @brief Find the nearest common dominator for multiple BasicBlocks
|
||||
///
|
||||
/// Helper class for AMDGPUStructurizeCFG
|
||||
/// TODO: Maybe move into common code
|
||||
class NearestCommonDominator {
|
||||
|
||||
DominatorTree *DT;
|
||||
|
||||
DTN2UnsignedMap IndexMap;
|
||||
|
||||
BasicBlock *Result;
|
||||
unsigned ResultIndex;
|
||||
bool ExplicitMentioned;
|
||||
|
||||
public:
|
||||
/// \brief Start a new query
|
||||
NearestCommonDominator(DominatorTree *DomTree) {
|
||||
DT = DomTree;
|
||||
Result = 0;
|
||||
}
|
||||
|
||||
/// \brief Add BB to the resulting dominator
|
||||
void addBlock(BasicBlock *BB, bool Remember = true) {
|
||||
|
||||
DomTreeNode *Node = DT->getNode(BB);
|
||||
|
||||
if (Result == 0) {
|
||||
unsigned Numbering = 0;
|
||||
for (;Node;Node = Node->getIDom())
|
||||
IndexMap[Node] = ++Numbering;
|
||||
Result = BB;
|
||||
ResultIndex = 1;
|
||||
ExplicitMentioned = Remember;
|
||||
return;
|
||||
}
|
||||
|
||||
for (;Node;Node = Node->getIDom())
|
||||
if (IndexMap.count(Node))
|
||||
break;
|
||||
else
|
||||
IndexMap[Node] = 0;
|
||||
|
||||
assert(Node && "Dominator tree invalid!");
|
||||
|
||||
unsigned Numbering = IndexMap[Node];
|
||||
if (Numbering > ResultIndex) {
|
||||
Result = Node->getBlock();
|
||||
ResultIndex = Numbering;
|
||||
ExplicitMentioned = Remember && (Result == BB);
|
||||
} else if (Numbering == ResultIndex) {
|
||||
ExplicitMentioned |= Remember;
|
||||
}
|
||||
}
|
||||
|
||||
/// \brief Is "Result" one of the BBs added with "Remember" = True?
|
||||
bool wasResultExplicitMentioned() {
|
||||
return ExplicitMentioned;
|
||||
}
|
||||
|
||||
/// \brief Get the query result
|
||||
BasicBlock *getResult() {
|
||||
return Result;
|
||||
}
|
||||
};
|
||||
|
||||
/// @brief Transforms the control flow graph on one single entry/exit region
|
||||
/// at a time.
|
||||
///
|
||||
|
Loading…
x
Reference in New Issue
Block a user