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

Chris Lattner lattner at cs.uiuc.edu
Thu Apr 22 10:00:02 PDT 2004


Changes in directory llvm/lib/Transforms/Scalar:

IndVarSimplify.cpp updated: 1.61 -> 1.62

---
Log message:

Fix an extremely serious thinko I made in revision 1.60 of this file.


---
Diffs of the changes:  (+25 -16)

Index: llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
diff -u llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.61 llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.62
--- llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.61	Wed Apr 21 18:36:08 2004
+++ llvm/lib/Transforms/Scalar/IndVarSimplify.cpp	Thu Apr 22 09:59:40 2004
@@ -390,8 +390,10 @@
   // Compute the type of the largest recurrence expression.
   //
   const Type *LargestType = IndVars[0].first->getType();
+  bool DifferingSizes = false;
   for (unsigned i = 1, e = IndVars.size(); i != e; ++i) {
     const Type *Ty = IndVars[i].first->getType();
+    DifferingSizes |= Ty->getPrimitiveSize() != LargestType->getPrimitiveSize();
     if (Ty->getPrimitiveSize() > LargestType->getPrimitiveSize())
       LargestType = Ty;
   }
@@ -418,26 +420,34 @@
   // If there were induction variables of other sizes, cast the primary
   // induction variable to the right size for them, avoiding the need for the
   // code evaluation methods to insert induction variables of different sizes.
+  if (DifferingSizes) {
+    bool InsertedSizes[17] = { false };
+    InsertedSizes[LargestType->getPrimitiveSize()] = true;
+    for (unsigned i = 0, e = IndVars.size(); i != e; ++i)
+      if (!InsertedSizes[IndVars[i].first->getType()->getPrimitiveSize()]) {
+        PHINode *PN = IndVars[i].first;
+        InsertedSizes[PN->getType()->getPrimitiveSize()] = true;
+        Instruction *New = new CastInst(IndVar,
+                                        PN->getType()->getUnsignedVersion(),
+                                        "indvar", InsertPt);
+        Rewriter.addInsertedValue(New, SE->getSCEV(New));
+      }
+  }
+
+  // If there were induction variables of other sizes, cast the primary
+  // induction variable to the right size for them, avoiding the need for the
+  // code evaluation methods to insert induction variables of different sizes.
   std::map<unsigned, Value*> InsertedSizes;
-  InsertedSizes[LargestType->getPrimitiveSize()] = IndVar;
   while (!IndVars.empty()) {
     PHINode *PN = IndVars.back().first;
-
-    const Type *Ty = PN->getType()->getUnsignedVersion();
-    Value *&IV = InsertedSizes[Ty->getPrimitiveSize()];
-    if (IV == 0) {
-      // Insert a new cast instruction, which will hold this recurrence.
-      std::string Name = PN->getName();
-      PN->setName("");
-      IV = new CastInst(IndVar, Ty, Name, InsertPt);
-    }
-
-    Value *V = IV;
-    if (PN->getType() != Ty)
-      V = new CastInst(V, PN->getType(), V->getName(), InsertPt);
+    Value *NewVal = Rewriter.ExpandCodeFor(IndVars.back().second, InsertPt,
+                                           PN->getType());
+    std::string Name = PN->getName();
+    PN->setName("");
+    NewVal->setName(Name);
 
     // Replace the old PHI Node with the inserted computation.
-    PN->replaceAllUsesWith(V);
+    PN->replaceAllUsesWith(NewVal);
     DeadInsts.insert(PN);
     IndVars.pop_back();
     ++NumRemoved;
@@ -468,7 +478,6 @@
           }          
         }
     }
-
 
   DeleteTriviallyDeadInstructions(DeadInsts);
 }





More information about the llvm-commits mailing list