Fix a bug in the previous checkin: if the exit block is not the same as
authorChris Lattner <sabre@nondot.org>
Thu, 15 Apr 2004 20:26:22 +0000 (20:26 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 15 Apr 2004 20:26:22 +0000 (20:26 +0000)
the back-edge block, we must check the preincremented value.

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

lib/Transforms/Scalar/IndVarSimplify.cpp

index 728e20e0cff978a3d0feaf18b031c6d44068850f..8462945a74297a4002abf6908a4e1671382b46e7 100644 (file)
@@ -209,13 +209,29 @@ void IndVarSimplify::LinearFunctionTestReplace(Loop *L, SCEV *IterationCount,
   if (Instruction *Cond = dyn_cast<Instruction>(BI->getCondition()))
     InstructionsToDelete.insert(Cond);
 
-  // The IterationCount expression contains the number of times that the
-  // backedge actually branches to the loop header.  This is one less than the
-  // number of times the loop executes, so add one to it.
-  Constant *OneC = ConstantInt::get(IterationCount->getType(), 1);
-  SCEVHandle TripCount=SCEVAddExpr::get(IterationCount, SCEVUnknown::get(OneC));
-
-  Value *IndVar = L->getCanonicalInductionVariableIncrement();
+  // If the exiting block is not the same as the backedge block, we must compare
+  // against the preincremented value, otherwise we prefer to compare against
+  // the post-incremented value.
+  BasicBlock *Header = L->getHeader();
+  pred_iterator HPI = pred_begin(Header);
+  assert(HPI != pred_end(Header) && "Loop with zero preds???");
+  if (!L->contains(*HPI)) ++HPI;
+  assert(HPI != pred_end(Header) && L->contains(*HPI) &&
+         "No backedge in loop?");
+
+  SCEVHandle TripCount = IterationCount;
+  Value *IndVar;
+  if (*HPI == ExitingBlock) {
+    // The IterationCount expression contains the number of times that the
+    // backedge actually branches to the loop header.  This is one less than the
+    // number of times the loop executes, so add one to it.
+    Constant *OneC = ConstantInt::get(IterationCount->getType(), 1);
+    TripCount = SCEVAddExpr::get(IterationCount, SCEVUnknown::get(OneC));
+    IndVar = L->getCanonicalInductionVariableIncrement();
+  } else {
+    // We have to use the preincremented value...
+    IndVar = L->getCanonicalInductionVariable();
+  }
 
   // Expand the code for the iteration count into the preheader of the loop.
   BasicBlock *Preheader = L->getLoopPreheader();