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

Chris Lattner lattner at cs.uiuc.edu
Mon Oct 11 16:07:03 PDT 2004



Changes in directory llvm/lib/Transforms/Scalar:

IndVarSimplify.cpp updated: 1.71 -> 1.72
---
Log message:

Handle a common case more carefully.  In particular, instead of transforming
pointer recurrences into expressions from this:

  %P_addr.0.i.0 = phi sbyte* [ getelementptr ([8 x sbyte]* %.str_1, int 0, int 0), %entry ], [ %inc.0.i, %no_exit.i ]
  %inc.0.i = getelementptr sbyte* %P_addr.0.i.0, int 1            ; <sbyte*> [#uses=2]

into this:

  %inc.0.i = getelementptr sbyte* getelementptr ([8 x sbyte]* %.str_1, int 0, int 0), int %inc.0.i.rec

Actually create something nice, like this:

  %inc.0.i = getelementptr [8 x sbyte]* %.str_1, int 0, int %inc.0.i.rec



---
Diffs of the changes:  (+33 -4)

Index: llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
diff -u llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.71 llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.72
--- llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.71	Sun Sep 19 23:43:14 2004
+++ llvm/lib/Transforms/Scalar/IndVarSimplify.cpp	Mon Oct 11 18:06:50 2004
@@ -45,6 +45,7 @@
 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
 #include "llvm/Analysis/LoopInfo.h"
 #include "llvm/Support/CFG.h"
+#include "llvm/Support/GetElementPtrTypeIterator.h"
 #include "llvm/Transforms/Utils/Local.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/ADT/Statistic.h"
@@ -135,9 +136,9 @@
                 while (isa<PHINode>(It)) ++It;
                 if (It != BasicBlock::iterator(CI)) {
                   // Splice the cast immediately after the operand in question.
-                  I->getParent()->getInstList().splice(It,
-                                                       CI->getParent()->getInstList(),
-                                                       CI);
+                  BasicBlock::InstListType &InstList =
+                    I->getParent()->getInstList();
+                  InstList.splice(It, InstList, CI);
                 }
                 return CI;
               }
@@ -345,7 +346,7 @@
         if (Instruction *U = dyn_cast<Instruction>(I->getOperand(i)))
           Insts.insert(U);
       SE->deleteInstructionFromRecords(I);
-      I->getParent()->getInstList().erase(I);
+      I->eraseFromParent();
       Changed = true;
     }
   }
@@ -387,6 +388,34 @@
       // Update the GEP to use the new recurrence we just inserted.
       GEPI->setOperand(1, NewAdd);
 
+      // If the incoming value is a constant expr GEP, try peeling out the array
+      // 0 index if possible to make things simpler.
+      if (ConstantExpr *CE = dyn_cast<ConstantExpr>(GEPI->getOperand(0)))
+        if (CE->getOpcode() == Instruction::GetElementPtr) {
+          unsigned NumOps = CE->getNumOperands();
+          assert(NumOps > 1 && "CE folding didn't work!");
+          if (CE->getOperand(NumOps-1)->isNullValue()) {
+            // Check to make sure the last index really is an array index.
+            gep_type_iterator GTI = gep_type_begin(GEPI);
+            for (unsigned i = 1, e = GEPI->getNumOperands()-1;
+                 i != e; ++i, ++GTI)
+              /*empty*/;
+            if (isa<SequentialType>(*GTI)) {
+              // Pull the last index out of the constant expr GEP.
+              std::vector<Value*> CEIdxs(CE->op_begin()+1, CE->op_end()-1);
+              Constant *NCE = ConstantExpr::getGetElementPtr(CE->getOperand(0),
+                                                             CEIdxs);
+              GetElementPtrInst *NGEPI =
+                new GetElementPtrInst(NCE, Constant::getNullValue(Type::IntTy),
+                                      NewAdd, GEPI->getName(), GEPI);
+              GEPI->replaceAllUsesWith(NGEPI);
+              GEPI->eraseFromParent();
+              GEPI = NGEPI;
+            }
+          }
+        }
+
+
       // Finally, if there are any other users of the PHI node, we must
       // insert a new GEP instruction that uses the pre-incremented version
       // of the induction amount.






More information about the llvm-commits mailing list