diff options
-rw-r--r-- | include/llvm/Analysis/Dominators.h | 15 | ||||
-rw-r--r-- | lib/Transforms/Utils/CodeExtractor.cpp | 4 |
2 files changed, 14 insertions, 5 deletions
diff --git a/include/llvm/Analysis/Dominators.h b/include/llvm/Analysis/Dominators.h index 29612dc..f36afd4 100644 --- a/include/llvm/Analysis/Dominators.h +++ b/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/lib/Transforms/Utils/CodeExtractor.cpp b/lib/Transforms/Utils/CodeExtractor.cpp index ce00e0e..f0eb625 100644 --- a/lib/Transforms/Utils/CodeExtractor.cpp +++ b/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); } } |