Refactor a bunch of code into a non-inlined method
authorChris Lattner <sabre@nondot.org>
Sat, 4 Feb 2006 09:51:33 +0000 (09:51 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 4 Feb 2006 09:51:33 +0000 (09:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25972 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/ScalarEvolutionExpander.h

index daf82dc853f5e2078c0e3ab398bdeec7e58cdd17..e155e3b6273ec4c041f4483076c66d78d6dc31bb 100644 (file)
@@ -86,6 +86,10 @@ namespace llvm {
       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 @@ namespace llvm {
 
     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;
     }