From d0a90b987673e22985c3407f413c76eb104777c4 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 24 Feb 2009 01:21:53 +0000 Subject: [PATCH] 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 --- lib/Transforms/Scalar/LoopDeletion.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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) -- 2.34.1