Preserve the DominanceFrontier analysis in the LoopDeletion pass.
authorDan Gohman <gohman@apple.com>
Tue, 24 Feb 2009 01:21:53 +0000 (01:21 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 24 Feb 2009 01:21:53 +0000 (01:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65359 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopDeletion.cpp

index ac807a4c9b20e11664a0df38046b18595941cc86..b64131cf18c790a6d8572a76c5d9ca8233d0bc1e 100644 (file)
@@ -53,6 +53,7 @@ namespace {
       AU.addPreserved<LoopInfo>();
       AU.addPreservedID(LoopSimplifyID);
       AU.addPreservedID(LCSSAID);
+      AU.addPreserved<DominanceFrontier>();
     }
   };
 }
@@ -228,6 +229,7 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
   // Update the dominator tree and remove the instructions and blocks that will
   // be deleted from the reference counting scheme.
   DominatorTree& DT = getAnalysis<DominatorTree>();
+  DominanceFrontier* DF = getAnalysisIfAvailable<DominanceFrontier>();
   SmallPtrSet<DomTreeNode*, 8> ChildNodes;
   for (Loop::block_iterator LI = L->block_begin(), LE = L->block_end();
        LI != LE; ++LI) {
@@ -235,12 +237,15 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) {
     // allows us to remove the domtree entry for the block.
     ChildNodes.insert(DT[*LI]->begin(), DT[*LI]->end());
     for (SmallPtrSet<DomTreeNode*, 8>::iterator DI = ChildNodes.begin(),
-         DE = ChildNodes.end(); DI != DE; ++DI)
+         DE = ChildNodes.end(); DI != DE; ++DI) {
       DT.changeImmediateDominator(*DI, DT[preheader]);
+      if (DF) DF->changeImmediateDominator((*DI)->getBlock(), preheader, &DT);
+    }
     
     ChildNodes.clear();
     DT.eraseNode(*LI);
-    
+    if (DF) DF->removeBlock(*LI);
+
     // Remove instructions that we're deleting from ScalarEvolution.
     for (BasicBlock::iterator BI = (*LI)->begin(), BE = (*LI)->end();
          BI != BE; ++BI)