Teach loopsimplify to update et-forest. Patch contributed by Daniel Berlin!
authorChris Lattner <sabre@nondot.org>
Mon, 9 Jan 2006 08:03:08 +0000 (08:03 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 9 Jan 2006 08:03:08 +0000 (08:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25153 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/LoopSimplify.cpp

index 2df10ce92f4dea5a3fac67462bb3bdcc17382d22..af0fe7820e689e09ba16a602e8c18fc7d666c06c 100644 (file)
@@ -69,6 +69,7 @@ namespace {
       AU.addPreserved<LoopInfo>();
       AU.addPreserved<DominatorSet>();
       AU.addPreserved<ImmediateDominators>();
+      AU.addPreserved<ETForest>();
       AU.addPreserved<DominatorTree>();
       AU.addPreserved<DominanceFrontier>();
       AU.addPreservedID(BreakCriticalEdgesID);  // No critical edges added.
@@ -334,6 +335,7 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) {
   // the old header.
   DominatorTree::Node *PHDomTreeNode =
     DT.createNewNode(NewBB, DT.getNode(Header)->getIDom());
+  BasicBlock *oldHeaderIDom = DT.getNode(Header)->getIDom()->getBlock();
 
   // Change the header node so that PNHode is the new immediate dominator
   DT.changeImmediateDominator(DT.getNode(Header), PHDomTreeNode);
@@ -359,6 +361,15 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) {
     // The preheader now is the immediate dominator for the header node...
     ID->setImmediateDominator(Header, NewBB);
   }
+  
+  // Update ET Forest information if we have it...
+  if (ETForest *EF = getAnalysisToUpdate<ETForest>()) {
+    // Whatever i-dominated the header node now immediately dominates NewBB
+    EF->addNewBlock(NewBB, oldHeaderIDom);
+
+    // The preheader now is the immediate dominator for the header node...
+    EF->setImmediateDominator(Header, NewBB);
+  }
 
   // Update dominance frontier information...
   if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
@@ -762,6 +773,7 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
         NewBBIDomNode = NewBBIDomNode->getIDom();
         assert(NewBBIDomNode && "No shared dominator found??");
       }
+      NewBBIDom = NewBBIDomNode->getBlock();
     }
 
     // Create the new dominator tree node... and set the idom of NewBB.
@@ -775,6 +787,13 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
     }
   }
 
+  // Update ET-Forest information if it is active.
+  if (ETForest *EF = getAnalysisToUpdate<ETForest>()) {
+    EF->addNewBlock(NewBB, NewBBIDom);
+    if (NewBBDominatesNewBBSucc)
+      EF->setImmediateDominator(NewBBSucc, NewBB);
+  }
+
   // Update dominance frontier information...
   if (DominanceFrontier *DF = getAnalysisToUpdate<DominanceFrontier>()) {
     // If NewBB dominates NewBBSucc, then DF(NewBB) is now going to be the