diff options
author | Chris Lattner <sabre@nondot.org> | 2004-04-18 22:27:10 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-04-18 22:27:10 +0000 |
commit | 827826320d204115d6a52ac7489e911ef7fab577 (patch) | |
tree | 882b88a55912d3e97651d5a71f507d24f5c787eb /llvm/lib/Transforms/Scalar/LoopSimplify.cpp | |
parent | d6ce359d3b9d40495d72c3d10ee3f6372c774a26 (diff) | |
download | bcm5719-llvm-827826320d204115d6a52ac7489e911ef7fab577.tar.gz bcm5719-llvm-827826320d204115d6a52ac7489e911ef7fab577.zip |
Correct rewriting of exit blocks after my last patch
llvm-svn: 13048
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopSimplify.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopSimplify.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplify.cpp b/llvm/lib/Transforms/Scalar/LoopSimplify.cpp index 167075f3be3..b2752089d44 100644 --- a/llvm/lib/Transforms/Scalar/LoopSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/LoopSimplify.cpp @@ -73,7 +73,7 @@ namespace { bool ProcessLoop(Loop *L); BasicBlock *SplitBlockPredecessors(BasicBlock *BB, const char *Suffix, const std::vector<BasicBlock*> &Preds); - void RewriteLoopExitBlock(Loop *L, BasicBlock *Exit); + BasicBlock *RewriteLoopExitBlock(Loop *L, BasicBlock *Exit); void InsertPreheaderForLoop(Loop *L); Loop *SeparateNestedLoop(Loop *L); void InsertUniqueBackedgeBlock(Loop *L); @@ -158,7 +158,11 @@ bool LoopSimplify::ProcessLoop(Loop *L) { for (pred_iterator PI = pred_begin(ExitBlock), PE = pred_end(ExitBlock); PI != PE; ++PI) if (!L->contains(*PI)) { - RewriteLoopExitBlock(L, ExitBlock); + BasicBlock *NewBB = RewriteLoopExitBlock(L, ExitBlock); + for (unsigned j = i; j != ExitBlocks.size(); ++j) + if (ExitBlocks[j] == ExitBlock) + ExitBlocks[j] = NewBB; + NumInserted++; Changed = true; break; @@ -387,7 +391,7 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) { /// RewriteLoopExitBlock - Ensure that the loop preheader dominates all exit /// blocks. This method is used to split exit blocks that have predecessors /// outside of the loop. -void LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) { +BasicBlock *LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) { DominatorSet &DS = getAnalysis<DominatorSet>(); std::vector<BasicBlock*> LoopBlocks; @@ -405,6 +409,7 @@ void LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) { // Update dominator information (set, immdom, domtree, and domfrontier) UpdateDomInfoForRevectoredPreds(NewBB, LoopBlocks); + return NewBB; } /// AddBlockAndPredsToSet - Add the specified block, and all of its |