diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 26010ebaa2fe..e01cf51794ef 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -2548,9 +2548,9 @@ SCEVHandle ScalarEvolutionsImpl::HowFarToZero(SCEV *V, const Loop *L) { if (SCEVConstant *StartC = dyn_cast(Start)) { ConstantInt *StartCC = StartC->getValue(); Constant *StartNegC = ConstantExpr::getNeg(StartCC); - Constant *Rem = ConstantExpr::getSRem(StartNegC, StepC->getValue()); + Constant *Rem = ConstantExpr::getURem(StartNegC, StepC->getValue()); if (Rem->isNullValue()) { - Constant *Result =ConstantExpr::getSDiv(StartNegC,StepC->getValue()); + Constant *Result = ConstantExpr::getUDiv(StartNegC,StepC->getValue()); return SE.getUnknown(Result); } } diff --git a/llvm/test/Analysis/ScalarEvolution/2008-05-25-NegativeStepToZero.ll b/llvm/test/Analysis/ScalarEvolution/2008-05-25-NegativeStepToZero.ll new file mode 100644 index 000000000000..922d9a97542e --- /dev/null +++ b/llvm/test/Analysis/ScalarEvolution/2008-05-25-NegativeStepToZero.ll @@ -0,0 +1,20 @@ +; RUN: llvm-as < %s | opt -analyze -scalar-evolution | grep {61 iterations} + +define i32 @func_6() nounwind { +entry: + br label %bb5 + +bb: ; preds = %bb5 + %tmp2 = add i32 %i.0, 1 ; [#uses=1] + %tmp4 = add i8 %x.0, -4 ; [#uses=1] + br label %bb5 + +bb5: ; preds = %bb, %entry + %x.0 = phi i8 [ 0, %entry ], [ %tmp4, %bb ] ; [#uses=2] + %i.0 = phi i32 [ 0, %entry ], [ %tmp2, %bb ] ; [#uses=2] + %tmp7 = icmp eq i8 %x.0, 12 ; [#uses=1] + br i1 %tmp7, label %return, label %bb + +return: ; preds = %bb5 + ret i32 %i.0 +}