[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