From d420fe63ea195c7d64096d604018cc42fede0fd9 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 14 Apr 2004 22:01:22 +0000 Subject: Implement a FIXME: if we're going to insert a cast, we might as well only insert it once! llvm-svn: 12955 --- llvm/lib/Analysis/ScalarEvolution.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Analysis') diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 62247e42ac4..f96cd5d82b8 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/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(); -- cgit v1.2.3