diff options
author | Devang Patel <dpatel@apple.com> | 2007-06-04 16:22:33 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-06-04 16:22:33 +0000 |
commit | a89566aefd19dd577cc4e662f9dfef94658efb3b (patch) | |
tree | a9e2c935a351bf9acd383223c823d7c0f6af513d | |
parent | b4c2690446f03553e9348720030d68d2774687ed (diff) | |
download | bcm5719-llvm-a89566aefd19dd577cc4e662f9dfef94658efb3b.tar.gz bcm5719-llvm-a89566aefd19dd577cc4e662f9dfef94658efb3b.zip |
Add basic block level interface to change immediate dominator
and create new node.
llvm-svn: 37414
-rw-r--r-- | llvm/include/llvm/Analysis/Dominators.h | 15 | ||||
-rw-r--r-- | llvm/lib/Transforms/Utils/CodeExtractor.cpp | 4 |
2 files changed, 14 insertions, 5 deletions
diff --git a/llvm/include/llvm/Analysis/Dominators.h b/llvm/include/llvm/Analysis/Dominators.h index 29612dc956f..f36afd4a2f0 100644 --- a/llvm/include/llvm/Analysis/Dominators.h +++ b/llvm/include/llvm/Analysis/Dominators.h @@ -110,7 +110,7 @@ private: /// DominatorTree - Calculate the immediate dominator tree for a function. /// class DominatorTreeBase : public DominatorBase { -public: + protected: std::map<BasicBlock*, DomTreeNode*> DomTreeNodes; void reset(); @@ -118,6 +118,7 @@ protected: DomTreeNode *RootNode; + // Information record used during immediate dominators computation. struct InfoRec { unsigned Semi; unsigned Size; @@ -136,8 +137,7 @@ protected: // Info - Collection of information used during the computation of idoms. std::map<BasicBlock*, InfoRec> Info; -public: -public: + public: DominatorTreeBase(intptr_t ID, bool isPostDom) : DominatorBase(ID, isPostDom) {} ~DominatorTreeBase() { reset(); } @@ -180,6 +180,10 @@ public: return DomTreeNodes[BB] = IDomNode->addChild(new DomTreeNode(BB, IDomNode)); } + void createNewNode(BasicBlock *BB, BasicBlock *DomBB) { + createNewNode(BB, getNode(DomBB)); + } + /// changeImmediateDominator - This method is used to update the dominator /// tree information when a node's immediate dominator changes. /// @@ -188,6 +192,11 @@ public: N->setIDom(NewIDom); } + void changeImmediateDominator(BasicBlock *BB, BasicBlock *NewBB) { + changeImmediateDominator(getNode(BB), getNode(NewBB)); + } + + /// removeNode - Removes a node from the dominator tree. Block must not /// dominate any other blocks. Invalidates any node pointing to removed /// block. diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp index ce00e0e1d8b..f0eb6250f72 100644 --- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp +++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp @@ -143,14 +143,14 @@ void CodeExtractor::severSplitPHINodes(BasicBlock *&Header) { // blocks that dominate TIBB plus the new block itself. if (EF) { BasicBlock* idom = EF->getIDom(OldPred); - DT->createNewNode(NewBB, DT->getNode(idom)); + DT->createNewNode(NewBB, idom); EF->addNewBlock(NewBB, idom); // Additionally, NewBB replaces OldPred as the immediate dominator of blocks Function *F = Header->getParent(); for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) if (EF->getIDom(I) == OldPred) { - DT->changeImmediateDominator(DT->getNode(I), DT->getNode(NewBB)); + DT->changeImmediateDominator(I, NewBB); EF->setImmediateDominator(I, NewBB); } } |