Fix PR582. The rewriter can move casts around, which invalidated the
authorChris Lattner <sabre@nondot.org>
Wed, 15 Jun 2005 21:29:31 +0000 (21:29 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 15 Jun 2005 21:29:31 +0000 (21:29 +0000)
BB iterator.  This fixes Transforms/IndVarsSimplify/2005-06-15-InstMoveCrash.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22221 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/IndVarSimplify.cpp

index 88ad6d206afefbe5c0f051b99328fc4003a9139d..5b7e4e1fd9ecdebfec5337ebaf33dedf4f8535fa 100644 (file)
@@ -551,7 +551,7 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
   for (unsigned i = 0, e = L->getBlocks().size(); i != e; ++i)
     if (LI->getLoopFor(L->getBlocks()[i]) == L) {  // Not in a subloop...
       BasicBlock *BB = L->getBlocks()[i];
-      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
+      for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;) {
         if (I->getType()->isInteger()) {      // Is an integer instruction
           SCEVHandle SH = SE->getSCEV(I);
           if (SH->hasComputableLoopEvolution(L) ||    // Varies predictably
@@ -571,6 +571,10 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
               if (!isa<SCEVCouldNotCompute>(ExitValue)) {
                 Changed = true;
                 ++NumReplaced;
+                // Remember the next instruction.  The rewriter can move code
+                // around in some cases.
+                BasicBlock::iterator NextI = I; ++NextI;
+
                 Value *NewVal = Rewriter.expandCodeFor(ExitValue, InsertPt,
                                                        I->getType());
 
@@ -582,10 +586,16 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L) {
                 // If this instruction is dead now, schedule it to be removed.
                 if (I->use_empty())
                   InstructionsToDelete.insert(I);
+                I = NextI;
+                continue;  // Skip the ++I
               }
             }
           }
         }
+
+        // Next instruction.  Continue instruction skips this.
+        ++I;
+      }
     }
 
   DeleteTriviallyDeadInstructions(InstructionsToDelete);