diff options
| author | Chris Lattner <sabre@nondot.org> | 2003-05-12 22:04:34 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2003-05-12 22:04:34 +0000 |
| commit | 0895025b305bb761e208892956e83148bdfaac3c (patch) | |
| tree | 41ffb97c04f9156e8a448a301f5aa015dce96be3 /llvm/lib/Transforms/Scalar | |
| parent | a7aebc9b2c00f08287cc79c01b5c6171d8f93067 (diff) | |
| download | bcm5719-llvm-0895025b305bb761e208892956e83148bdfaac3c.tar.gz bcm5719-llvm-0895025b305bb761e208892956e83148bdfaac3c.zip | |
Fix bug: LoopPreheaders/2003-05-12-PreheaderExitOfChild.ll
llvm-svn: 6153
Diffstat (limited to 'llvm/lib/Transforms/Scalar')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSimplify.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplify.cpp b/llvm/lib/Transforms/Scalar/LoopSimplify.cpp index d5988b16526..7576b011305 100644 --- a/llvm/lib/Transforms/Scalar/LoopSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSimplify.cpp @@ -167,6 +167,19 @@ BasicBlock *Preheaders::SplitBlockPredecessors(BasicBlock *BB, return NewBB; } +// ChangeExitBlock - This recursive function is used to change any exit blocks +// that use OldExit to use NewExit instead. This is recursive because children +// may need to be processed as well. +// +static void ChangeExitBlock(Loop *L, BasicBlock *OldExit, BasicBlock *NewExit) { + if (L->hasExitBlock(OldExit)) { + L->changeExitBlock(OldExit, NewExit); + const std::vector<Loop*> &SubLoops = L->getSubLoops(); + for (unsigned i = 0, e = SubLoops.size(); i != e; ++i) + ChangeExitBlock(SubLoops[i], OldExit, NewExit); + } +} + /// InsertPreheaderForLoop - Once we discover that a loop doesn't have a /// preheader, this method is called to insert one. This method has two phases: @@ -197,18 +210,19 @@ void Preheaders::InsertPreheaderForLoop(Loop *L) { // If the header for the loop used to be an exit node for another loop, then // we need to update this to know that the loop-preheader is now the exit // node. Note that the only loop that could have our header as an exit node - // is a sibling loop, ie, one with the same parent loop. + // is a sibling loop, ie, one with the same parent loop, or one if it's + // children. + // const std::vector<Loop*> *ParentSubLoops; if (Loop *Parent = L->getParentLoop()) ParentSubLoops = &Parent->getSubLoops(); else // Must check top-level loops... ParentSubLoops = &getAnalysis<LoopInfo>().getTopLevelLoops(); - // Loop over all sibling loops, performing the substitution... + // Loop over all sibling loops, performing the substitution (recursively to + // include child loops)... for (unsigned i = 0, e = ParentSubLoops->size(); i != e; ++i) - if ((*ParentSubLoops)[i]->hasExitBlock(Header)) - (*ParentSubLoops)[i]->changeExitBlock(Header, NewBB); - + ChangeExitBlock((*ParentSubLoops)[i], Header, NewBB); DominatorSet &DS = getAnalysis<DominatorSet>(); // Update dominator info { |

