[llvm-commits] CVS: llvm/include/llvm/Analysis/ScalarEvolutionExpander.h
Chris Lattner
lattner at cs.uiuc.edu
Sat Feb 4 01:51:45 PST 2006
Changes in directory llvm/include/llvm/Analysis:
ScalarEvolutionExpander.h updated: 1.3 -> 1.4
---
Log message:
Refactor a bunch of code into a non-inlined method
---
Diffs of the changes: (+6 -33)
ScalarEvolutionExpander.h | 39 ++++++---------------------------------
1 files changed, 6 insertions(+), 33 deletions(-)
Index: llvm/include/llvm/Analysis/ScalarEvolutionExpander.h
diff -u llvm/include/llvm/Analysis/ScalarEvolutionExpander.h:1.3 llvm/include/llvm/Analysis/ScalarEvolutionExpander.h:1.4
--- llvm/include/llvm/Analysis/ScalarEvolutionExpander.h:1.3 Fri Feb 3 23:49:01 2006
+++ llvm/include/llvm/Analysis/ScalarEvolutionExpander.h Sat Feb 4 03:51:33 2006
@@ -86,6 +86,10 @@
return expandInTy(SH, Ty);
}
+ /// InsertCastOfTo - Insert a cast of V to the specified type, doing what
+ /// we can to share the casts.
+ static Value *InsertCastOfTo(Value *V, const Type *Ty);
+
protected:
Value *expand(SCEV *S) {
// Check to see if we already expanded this.
@@ -100,39 +104,8 @@
Value *expandInTy(SCEV *S, const Type *Ty) {
Value *V = expand(S);
- if (Ty && V->getType() != Ty) {
- // FIXME: keep track of the cast instruction.
- if (Constant *C = dyn_cast<Constant>(V))
- return ConstantExpr::getCast(C, Ty);
- else if (Instruction *I = dyn_cast<Instruction>(V)) {
- // 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<CastInst>(cast<Instruction>(*UI))) {
- BasicBlock::iterator It = I; ++It;
- if (isa<InvokeInst>(I))
- It = cast<InvokeInst>(I)->getNormalDest()->begin();
- while (isa<PHINode>(It)) ++It;
- if (It != BasicBlock::iterator(CI)) {
- // Splice the cast immediately after the operand in question.
- BasicBlock::InstListType &InstList =
- It->getParent()->getInstList();
- InstList.splice(It, CI->getParent()->getInstList(), CI);
- }
- return CI;
- }
- }
- BasicBlock::iterator IP = I; ++IP;
- if (InvokeInst *II = dyn_cast<InvokeInst>(I))
- IP = II->getNormalDest()->begin();
- while (isa<PHINode>(IP)) ++IP;
- return new CastInst(V, Ty, V->getName(), IP);
- } else {
- // FIXME: check to see if there is already a cast!
- return new CastInst(V, Ty, V->getName(), InsertPt);
- }
- }
+ if (Ty && V->getType() != Ty)
+ return InsertCastOfTo(V, Ty);
return V;
}
More information about the llvm-commits
mailing list