When inserting casts, be careful of where we put them. We cannot insert
authorChris Lattner <sabre@nondot.org>
Sat, 6 May 2006 09:10:37 +0000 (09:10 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 6 May 2006 09:10:37 +0000 (09:10 +0000)
a cast immediately before a PHI node.

This fixes Regression/CodeGen/Generic/2006-05-06-GEP-Cast-Sink-Crash.ll

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

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index dd7559b975ad714577c175a398cc2db222941b62..4ea83508bf1d7ff3d49c9934aba81d252324453f 100644 (file)
@@ -2789,8 +2789,9 @@ static bool OptimizeNoopCopyExpression(CastInst *CI) {
 
 /// InsertGEPComputeCode - Insert code into BB to compute Ptr+PtrOffset,
 /// casting to the type of GEPI.
-static Value *InsertGEPComputeCode(Value *&V, BasicBlock *BB, Instruction *GEPI,
-                                   Value *Ptr, Value *PtrOffset) {
+static Instruction *InsertGEPComputeCode(Instruction *&V, BasicBlock *BB,
+                                         Instruction *GEPI, Value *Ptr,
+                                         Value *PtrOffset) {
   if (V) return V;   // Already computed.
   
   BasicBlock::iterator InsertPt;
@@ -2813,8 +2814,7 @@ static Value *InsertGEPComputeCode(Value *&V, BasicBlock *BB, Instruction *GEPI,
   
   // Add the offset, cast it to the right type.
   Ptr = BinaryOperator::createAdd(Ptr, PtrOffset, "", InsertPt);
-  Ptr = new CastInst(Ptr, GEPI->getType(), "", InsertPt);
-  return V = Ptr;
+  return V = new CastInst(Ptr, GEPI->getType(), "", InsertPt);
 }
 
 /// ReplaceUsesOfGEPInst - Replace all uses of RepPtr with inserted code to
@@ -2827,7 +2827,7 @@ static Value *InsertGEPComputeCode(Value *&V, BasicBlock *BB, Instruction *GEPI,
 static void ReplaceUsesOfGEPInst(Instruction *RepPtr, Value *Ptr, 
                                  Constant *PtrOffset, BasicBlock *DefBB,
                                  GetElementPtrInst *GEPI,
-                                 std::map<BasicBlock*,Value*> &InsertedExprs) {
+                           std::map<BasicBlock*,Instruction*> &InsertedExprs) {
   while (!RepPtr->use_empty()) {
     Instruction *User = cast<Instruction>(RepPtr->use_back());
     
@@ -2843,7 +2843,7 @@ static void ReplaceUsesOfGEPInst(Instruction *RepPtr, Value *Ptr,
     
     // If this is a load of the pointer, or a store through the pointer, emit
     // the increment into the load/store block.
-    Value *NewVal;
+    Instruction *NewVal;
     if (isa<LoadInst>(User) ||
         (isa<StoreInst>(User) && User->getOperand(0) != RepPtr)) {
       NewVal = InsertGEPComputeCode(InsertedExprs[User->getParent()], 
@@ -2856,8 +2856,11 @@ static void ReplaceUsesOfGEPInst(Instruction *RepPtr, Value *Ptr,
                                     Ptr, PtrOffset);
     }
     
-    if (GEPI->getType() != RepPtr->getType())
-      NewVal = new CastInst(NewVal, RepPtr->getType(), "", User);
+    if (GEPI->getType() != RepPtr->getType()) {
+      BasicBlock::iterator IP = NewVal;
+      ++IP;
+      NewVal = new CastInst(NewVal, RepPtr->getType(), "", IP);
+    }
     User->replaceUsesOfWith(RepPtr, NewVal);
   }
 }
@@ -2970,7 +2973,7 @@ static bool OptimizeGEPExpression(GetElementPtrInst *GEPI,
   // block, otherwise we use a canonical version right next to the gep (these 
   // won't be foldable as addresses, so we might as well share the computation).
   
-  std::map<BasicBlock*,Value*> InsertedExprs;
+  std::map<BasicBlock*,Instruction*> InsertedExprs;
   ReplaceUsesOfGEPInst(GEPI, Ptr, PtrOffset, DefBB, GEPI, InsertedExprs);
   
   // Finally, the GEP is dead, remove it.