diff options
author | Chris Lattner <sabre@nondot.org> | 2007-05-15 00:16:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-05-15 00:16:00 +0000 |
commit | 6b6aef8efc1e55ca01811a505bc3da27d9cb6ccb (patch) | |
tree | 9a054e4ae5e945ed17bf18d8710daee4e9507983 | |
parent | 24bb504e151224f3775fac6c93e3933906a6d86e (diff) |
Fix Transforms/InstCombine/2007-05-14-Crash.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37057 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 01385db6c1..08905576d2 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -6454,16 +6454,25 @@ Instruction *InstCombiner::commonPointerCastTransforms(CastInst &CI) { while (Offset) { if (const StructType *STy = dyn_cast<StructType>(GEPIdxTy)) { const StructLayout *SL = TD->getStructLayout(STy); - unsigned Elt = SL->getElementContainingOffset(Offset); - NewIndices.push_back(ConstantInt::get(Type::Int32Ty, Elt)); + if (Offset < (int64_t)SL->getSizeInBytes()) { + unsigned Elt = SL->getElementContainingOffset(Offset); + NewIndices.push_back(ConstantInt::get(Type::Int32Ty, Elt)); - Offset -= SL->getElementOffset(Elt); - GEPIdxTy = STy->getElementType(Elt); + Offset -= SL->getElementOffset(Elt); + GEPIdxTy = STy->getElementType(Elt); + } else { + // Otherwise, we can't index into this, bail out. + Offset = 0; + OrigBase = 0; + } } else if (isa<ArrayType>(GEPIdxTy) || isa<VectorType>(GEPIdxTy)) { const SequentialType *STy = cast<SequentialType>(GEPIdxTy); - uint64_t EltSize = TD->getTypeSize(STy->getElementType()); - NewIndices.push_back(ConstantInt::get(IntPtrTy, Offset/EltSize)); - Offset %= EltSize; + if (uint64_t EltSize = TD->getTypeSize(STy->getElementType())) { + NewIndices.push_back(ConstantInt::get(IntPtrTy,Offset/EltSize)); + Offset %= EltSize; + } else { + NewIndices.push_back(ConstantInt::get(IntPtrTy, 0)); + } GEPIdxTy = STy->getElementType(); } else { // Otherwise, we can't index into this, bail out. |