Implement IndVarsSimplify/pointer-indvars.ll, transforming pointer
authorChris Lattner <sabre@nondot.org>
Mon, 22 Dec 2003 05:02:01 +0000 (05:02 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 22 Dec 2003 05:02:01 +0000 (05:02 +0000)
arithmetic into "array subscripts"

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10580 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/IndVarSimplify.cpp

index 954844be40092c50702fe45a22671b11d25690a5..ac986eaac41e4bb43b316467198f27b81389d375 100644 (file)
@@ -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 @@ bool IndVarSimplify::runOnLoop(Loop *Loop) {
 
     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 @@ bool IndVarSimplify::runOnLoop(Loop *Loop) {
                                      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);