diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 62247e42ac4..f96cd5d82b8 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -2484,7 +2484,21 @@ Value *ScalarEvolutionRewriter::ExpandCodeFor(SCEVHandle SH, if (Constant *C = dyn_cast(V)) return ConstantExpr::getCast(C, Ty); else if (Instruction *I = dyn_cast(V)) { - // FIXME: check to see if there is already a cast! + // Check to see if there is already a cast. If there is, use it. + for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); + UI != E; ++UI) { + if ((*UI)->getType() == Ty) + if (CastInst *CI = dyn_cast(cast(*UI))) { + BasicBlock::iterator It = I; ++It; + if (It != BasicBlock::iterator(CI)) { + // Splice the cast immediately after the operand in question. + I->getParent()->getInstList().splice(It, + CI->getParent()->getInstList(), + CI); + } + return CI; + } + } BasicBlock::iterator IP = I; ++IP; if (InvokeInst *II = dyn_cast(I)) IP = II->getNormalDest()->begin();