From ead28bd04bf42cdf8c29d12fa4c0f9d29a4c58cd Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 27 May 2009 20:00:18 +0000 Subject: In ChangeCompareStride, when the stride to be reused is truncated to a smaller type, promoted its offset back up to the type of the new comparison. This fixes PR4222. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72493 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopStrengthReduce.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'lib/Transforms/Scalar/LoopStrengthReduce.cpp') diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index adfa5272a9..834a95d731 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -2005,11 +2005,16 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond, ConstantInt *CI = ConstantInt::get(NewCmpIntTy, NewCmpVal); NewCmpRHS = ConstantExpr::getIntToPtr(CI, NewCmpTy); } + NewOffset = CondUse->getOffset(); + if (CondUse->isSigned()) + NewOffset = SE->getNoopOrSignExtend(CondUse->getOffset(), NewCmpTy); + else + NewOffset = SE->getNoopOrZeroExtend(CondUse->getOffset(), NewCmpTy); NewOffset = TyBits == NewTyBits - ? SE->getMulExpr(CondUse->getOffset(), + ? SE->getMulExpr(NewOffset, SE->getConstant(ConstantInt::get(CmpTy, Scale))) : SE->getConstant(ConstantInt::get(NewCmpIntTy, - cast(CondUse->getOffset())->getValue() + cast(NewOffset)->getValue() ->getSExtValue()*Scale)); break; } -- cgit v1.2.3-70-g09d2