From: Dan Gohman Date: Tue, 24 Feb 2009 01:21:53 +0000 (+0000) Subject: Preserve the DominanceFrontier analysis in the LoopDeletion pass. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d0a90b987673e22985c3407f413c76eb104777c4;p=oota-llvm.git Preserve the DominanceFrontier analysis in the LoopDeletion pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65359 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LoopDeletion.cpp b/lib/Transforms/Scalar/LoopDeletion.cpp index ac807a4c9b2..b64131cf18c 100644 --- a/lib/Transforms/Scalar/LoopDeletion.cpp +++ b/lib/Transforms/Scalar/LoopDeletion.cpp @@ -53,6 +53,7 @@ namespace { AU.addPreserved(); AU.addPreservedID(LoopSimplifyID); AU.addPreservedID(LCSSAID); + AU.addPreserved(); } }; } @@ -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(); + DominanceFrontier* DF = getAnalysisIfAvailable(); SmallPtrSet 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::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)