diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 5302ea87de8..027ce6ffe15 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -2613,21 +2613,28 @@ SCEVHandle ScalarEvolution::getSCEVAtScope(SCEV *V, const Loop *L) { // If any of the operands is non-constant and if they are // non-integer and non-pointer, don't even try to analyze them // with scev techniques. - if (!isa(Op->getType()) && - !isa(Op->getType())) + if (!isSCEVable(Op->getType())) return V; SCEVHandle OpV = getSCEVAtScope(getSCEV(Op), L); - if (SCEVConstant *SC = dyn_cast(OpV)) - Operands.push_back(ConstantExpr::getIntegerCast(SC->getValue(), - Op->getType(), - false)); - else if (SCEVUnknown *SU = dyn_cast(OpV)) { - if (Constant *C = dyn_cast(SU->getValue())) - Operands.push_back(ConstantExpr::getIntegerCast(C, - Op->getType(), - false)); - else + if (SCEVConstant *SC = dyn_cast(OpV)) { + Constant *C = SC->getValue(); + if (C->getType() != Op->getType()) + C = ConstantExpr::getCast(CastInst::getCastOpcode(C, false, + Op->getType(), + false), + C, Op->getType()); + Operands.push_back(C); + } else if (SCEVUnknown *SU = dyn_cast(OpV)) { + if (Constant *C = dyn_cast(SU->getValue())) { + if (C->getType() != Op->getType()) + C = + ConstantExpr::getCast(CastInst::getCastOpcode(C, false, + Op->getType(), + false), + C, Op->getType()); + Operands.push_back(C); + } else return V; } else { return V; diff --git a/test/Transforms/LoopStrengthReduce/pr3086.ll b/test/Transforms/LoopStrengthReduce/pr3086.ll index 4ca333f6146..f92bfe2b68c 100644 --- a/test/Transforms/LoopStrengthReduce/pr3086.ll +++ b/test/Transforms/LoopStrengthReduce/pr3086.ll @@ -1,4 +1,5 @@ ; RUN: llvm-as < %s | opt -loop-reduce -disable-output +; RUN: llvm-as < %s | opt -analyze -scalar-evolution -disable-output ; PR 3086 %struct.Cls = type { i32, i8, [2 x %struct.Cls*], [2 x %struct.Lit*] }