From d7a559e353a2ba5b8f51573f96ce3f06ad34f4cb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 15 Apr 2004 20:26:22 +0000 Subject: Fix a bug in the previous checkin: if the exit block is not the same as the back-edge block, we must check the preincremented value. llvm-svn: 12968 --- llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 30 ++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) (limited to 'llvm/lib/Transforms/Scalar') diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index 728e20e0cff..8462945a742 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -209,13 +209,29 @@ void IndVarSimplify::LinearFunctionTestReplace(Loop *L, SCEV *IterationCount, if (Instruction *Cond = dyn_cast(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(); -- cgit v1.2.3