diff options
author | Chris Lattner <sabre@nondot.org> | 2006-05-06 09:10:37 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-05-06 09:10:37 +0000 |
commit | f0df8824eb2bf8a5fb91ce6fd1db590caf34f994 (patch) | |
tree | 683aa0a71f7edaec7c5d895c11ad72c90a5149f4 /lib | |
parent | 707f41302b51e0ff4e266933387b2c62bbb596e8 (diff) | |
download | external_llvm-f0df8824eb2bf8a5fb91ce6fd1db590caf34f994.zip external_llvm-f0df8824eb2bf8a5fb91ce6fd1db590caf34f994.tar.gz external_llvm-f0df8824eb2bf8a5fb91ce6fd1db590caf34f994.tar.bz2 |
When inserting casts, be careful of where we put them. We cannot insert
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index dd7559b..4ea8350 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -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. |