1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 12:02:58 +02:00

Fix Transforms/InstCombine/2007-05-14-Crash.ll

llvm-svn: 37057
This commit is contained in:
Chris Lattner 2007-05-15 00:16:00 +00:00
parent e76dccb73f
commit dfc6f4a06c

View File

@ -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.