diff options
author | Chris Lattner <sabre@nondot.org> | 2006-02-14 22:34:08 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-02-14 22:34:08 +0000 |
commit | c27e056d4fd7f6ecdd8e40eb92230be380c5c8c9 (patch) | |
tree | c0acfdc5c986147f7b94370a43c6b76df8ffbc82 | |
parent | ae302ab9cbe4e3a5f2eb1a09146ff235e16832d1 (diff) | |
download | external_llvm-c27e056d4fd7f6ecdd8e40eb92230be380c5c8c9.zip external_llvm-c27e056d4fd7f6ecdd8e40eb92230be380c5c8c9.tar.gz external_llvm-c27e056d4fd7f6ecdd8e40eb92230be380c5c8c9.tar.bz2 |
When splitting exit edges to canonicalize loops, make sure to put the new
block in the appropriate loop nest.
Third time is the charm, right?
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26187 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Utils/LoopSimplify.cpp | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/lib/Transforms/Utils/LoopSimplify.cpp b/lib/Transforms/Utils/LoopSimplify.cpp index a8aa0e0..a41692b 100644 --- a/lib/Transforms/Utils/LoopSimplify.cpp +++ b/lib/Transforms/Utils/LoopSimplify.cpp @@ -57,6 +57,7 @@ namespace { // AA - If we have an alias analysis object to update, this is it, otherwise // this is null. AliasAnalysis *AA; + LoopInfo *LI; virtual bool runOnFunction(Function &F); @@ -100,10 +101,10 @@ FunctionPass *llvm::createLoopSimplifyPass() { return new LoopSimplify(); } /// bool LoopSimplify::runOnFunction(Function &F) { bool Changed = false; - LoopInfo &LI = getAnalysis<LoopInfo>(); + LI = &getAnalysis<LoopInfo>(); AA = getAnalysisToUpdate<AliasAnalysis>(); - for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) + for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I) Changed |= ProcessLoop(*I); return Changed; @@ -159,9 +160,8 @@ bool LoopSimplify::ProcessLoop(Loop *L) { // predecessors from outside of the loop, split the edge now. std::vector<BasicBlock*> ExitBlocks; L->getExitBlocks(ExitBlocks); - + SetVector<BasicBlock*> ExitBlockSet(ExitBlocks.begin(), ExitBlocks.end()); - LoopInfo &LI = getAnalysis<LoopInfo>(); for (SetVector<BasicBlock*>::iterator I = ExitBlockSet.begin(), E = ExitBlockSet.end(); I != E; ++I) { BasicBlock *ExitBlock = *I; @@ -326,7 +326,7 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) { // We know that we have loop information to update... update it now. if (Loop *Parent = L->getParentLoop()) - Parent->addBasicBlockToLoop(NewBB, getAnalysis<LoopInfo>()); + Parent->addBasicBlockToLoop(NewBB, *LI); DominatorSet &DS = getAnalysis<DominatorSet>(); // Update dominator info DominatorTree &DT = getAnalysis<DominatorTree>(); @@ -414,8 +414,6 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) { /// blocks. This method is used to split exit blocks that have predecessors /// outside of the loop. BasicBlock *LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) { - DominatorSet &DS = getAnalysis<DominatorSet>(); - std::vector<BasicBlock*> LoopBlocks; for (pred_iterator I = pred_begin(Exit), E = pred_end(Exit); I != E; ++I) if (L->contains(*I)) @@ -424,10 +422,16 @@ BasicBlock *LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) { assert(!LoopBlocks.empty() && "No edges coming in from outside the loop?"); BasicBlock *NewBB = SplitBlockPredecessors(Exit, ".loopexit", LoopBlocks); - // Update Loop Information - we know that the new block will be in the parent - // loop of L. - if (Loop *Parent = L->getParentLoop()) - Parent->addBasicBlockToLoop(NewBB, getAnalysis<LoopInfo>()); + // Update Loop Information - we know that the new block will be in whichever + // loop the Exit block is in. Note that it may not be in that immediate loop, + // if the successor is some other loop header. In that case, we continue + // walking up the loop tree to find a loop that contains both the successor + // block and the predecessor block. + Loop *SuccLoop = LI->getLoopFor(Exit); + while (SuccLoop && !SuccLoop->contains(L->getHeader())) + SuccLoop = SuccLoop->getParentLoop(); + if (SuccLoop) + SuccLoop->addBasicBlockToLoop(NewBB, *LI); // Update dominator information (set, immdom, domtree, and domfrontier) UpdateDomInfoForRevectoredPreds(NewBB, LoopBlocks); @@ -511,17 +515,15 @@ Loop *LoopSimplify::SeparateNestedLoop(Loop *L) { // Create the new outer loop. Loop *NewOuter = new Loop(); - LoopInfo &LI = getAnalysis<LoopInfo>(); - // Change the parent loop to use the outer loop as its child now. if (Loop *Parent = L->getParentLoop()) Parent->replaceChildLoopWith(L, NewOuter); else - LI.changeTopLevelLoop(L, NewOuter); + LI->changeTopLevelLoop(L, NewOuter); // This block is going to be our new header block: add it to this loop and all // parent loops. - NewOuter->addBasicBlockToLoop(NewBB, getAnalysis<LoopInfo>()); + NewOuter->addBasicBlockToLoop(NewBB, *LI); // L is now a subloop of our outer loop. NewOuter->addChildLoop(L); @@ -553,8 +555,8 @@ Loop *LoopSimplify::SeparateNestedLoop(Loop *L) { if (!BlocksInL.count(BB)) { // Move this block to the parent, updating the exit blocks sets L->removeBlockFromLoop(BB); - if (LI[BB] == L) - LI.changeLoopFor(BB, NewOuter); + if ((*LI)[BB] == L) + LI->changeLoopFor(BB, NewOuter); --i; } } @@ -656,7 +658,7 @@ void LoopSimplify::InsertUniqueBackedgeBlock(Loop *L) { // Update Loop Information - we know that this block is now in the current // loop and all parent loops. - L->addBasicBlockToLoop(BEBlock, getAnalysis<LoopInfo>()); + L->addBasicBlockToLoop(BEBlock, *LI); // Update dominator information (set, immdom, domtree, and domfrontier) UpdateDomInfoForRevectoredPreds(BEBlock, BackedgeBlocks); |