[llvm-commits] CVS: llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Dec 21 23:03:01 PST 2003


Changes in directory llvm/lib/Transforms/Scalar:

IndVarSimplify.cpp updated: 1.48 -> 1.49

---
Log message:

Implement IndVarsSimplify/pointer-indvars.ll, transforming pointer
arithmetic into "array subscripts"


---
Diffs of the changes:  (+19 -9)

Index: llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
diff -u llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.48 llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.49
--- llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.48	Sun Dec 21 21:58:44 2003
+++ llvm/lib/Transforms/Scalar/IndVarSimplify.cpp	Sun Dec 21 23:02:01 2003
@@ -17,8 +17,7 @@
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Constants.h"
 #include "llvm/Type.h"
-#include "llvm/iPHINode.h"
-#include "llvm/iOther.h"
+#include "llvm/Instructions.h"
 #include "llvm/Analysis/InductionVariable.h"
 #include "llvm/Analysis/LoopInfo.h"
 #include "llvm/Support/CFG.h"
@@ -195,12 +194,12 @@
 
     while (isa<PHINode>(AfterPHIIt)) ++AfterPHIIt;
 
-    // Don't do math with pointers...
-    const Type *IVTy = IV->Phi->getType();
-    if (isa<PointerType>(IVTy)) IVTy = Type::ULongTy;
-
     // Don't modify the canonical indvar or unrecognized indvars...
     if (IV != Canonical && IV->InductionType != InductionVariable::Unknown) {
+      const Type *IVTy = IV->Phi->getType();
+      if (isa<PointerType>(IVTy))    // If indexing into a pointer, make the
+        IVTy = TD->getIntPtrType();  // index the appropriate type.
+
       Instruction *Val = IterCount;
       if (!isa<ConstantInt>(IV->Step) ||   // If the step != 1
           !cast<ConstantInt>(IV->Step)->equalsInt(1)) {
@@ -216,15 +215,26 @@
                                      IV->Phi->getName()+"-scale", AfterPHIIt);
       }
 
-      // If the start != 0
-      if (IV->Start != Constant::getNullValue(IV->Start->getType())) {
+      // If this is a pointer indvar...
+      if (isa<PointerType>(IV->Phi->getType())) {
+        std::vector<Value*> Idx;
+        // FIXME: this should not be needed when we fix PR82!
+        if (Val->getType() != Type::LongTy)
+          Val = new CastInst(Val, Type::LongTy, Val->getName(), AfterPHIIt);
+        Idx.push_back(Val);
+        Val = new GetElementPtrInst(IV->Start, Idx,
+                                    IV->Phi->getName()+"-offset",
+                                    AfterPHIIt);
+        
+      } else if (!isa<Constant>(IV->Start) ||   // If Start != 0...
+                 !cast<Constant>(IV->Start)->isNullValue()) {
         // If the types are not compatible, insert a cast now...
         if (Val->getType() != IVTy)
           Val = new CastInst(Val, IVTy, Val->getName(), AfterPHIIt);
         if (IV->Start->getType() != IVTy)
           IV->Start = new CastInst(IV->Start, IVTy, IV->Start->getName(),
                                    AfterPHIIt);
-
+        
         // Insert the instruction after the phi nodes...
         Val = BinaryOperator::create(Instruction::Add, Val, IV->Start,
                                      IV->Phi->getName()+"-offset", AfterPHIIt);





More information about the llvm-commits mailing list