diff options
author | Devang Patel <dpatel@apple.com> | 2007-07-19 02:29:24 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-07-19 02:29:24 +0000 |
commit | a8a8a366299863fe3711880add4c041c437b63cf (patch) | |
tree | 40eae562cd3e669ce7403c758505ba8e1ce76ea1 /lib/Transforms/Utils/BasicBlockUtils.cpp | |
parent | 72ea8d9060977db557cdeb39a9de198af087951c (diff) |
After a basic block is split into two parts,
second part dominates all the blocks dominated
by original basic block. And first part dominates
second part.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40035 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r-- | lib/Transforms/Utils/BasicBlockUtils.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/Transforms/Utils/BasicBlockUtils.cpp b/lib/Transforms/Utils/BasicBlockUtils.cpp index 520cfeb58b..0ed3ed6ad5 100644 --- a/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -165,8 +165,21 @@ BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt, Pass *P) { if (Loop *L = LI.getLoopFor(Old)) L->addBasicBlockToLoop(New, LI); - if (DominatorTree *DT = P->getAnalysisToUpdate<DominatorTree>()) - DT->addNewBlock(New, Old); + if (DominatorTree *DT = P->getAnalysisToUpdate<DominatorTree>()) + { + // Old dominates New. New node domiantes all other nodes dominated by Old. + DomTreeNode *OldNode = DT->getNode(Old); + std::vector<DomTreeNode *> Children; + for (DomTreeNode::iterator I = OldNode->begin(), E = OldNode->end(); + I != E; ++I) + Children.push_back(*I); + + DomTreeNode *NewNode = DT->addNewBlock(New,Old); + + for (std::vector<DomTreeNode *>::iterator I = Children.begin(), + E = Children.end(); I != E; ++I) + DT->changeImmediateDominator(*I, NewNode); + } if (DominanceFrontier *DF = P->getAnalysisToUpdate<DominanceFrontier>()) DF->splitBlock(Old); |