From: Chris Lattner Date: Wed, 14 Apr 2004 22:01:22 +0000 (+0000) Subject: Implement a FIXME: if we're going to insert a cast, we might as well only X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=e9fc96e7cc437d5f697e9205556099e875c4fc4e;p=oota-llvm.git Implement a FIXME: if we're going to insert a cast, we might as well only insert it once! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12955 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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();