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 | |
| 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
| -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  | 

