After a basic block is split into two parts,
authorDevang Patel <dpatel@apple.com>
Thu, 19 Jul 2007 02:29:24 +0000 (02:29 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 19 Jul 2007 02:29:24 +0000 (02:29 +0000)
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

lib/Transforms/Utils/BasicBlockUtils.cpp

index 520cfeb58b61c108188de8165b2eaa8bfc431e10..0ed3ed6ad57bc88942aac1c3a2b0b7c3483a16c7 100644 (file)
@@ -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);