mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-18 12:29:21 +00:00
Fix InstCombine/2007-05-04-Crash.ll and PR1384
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36775 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
51e04da381
commit
c42e226f08
@ -6404,21 +6404,25 @@ Instruction *InstCombiner::commonPointerCastTransforms(CastInst &CI) {
|
||||
if (GEPIdxTy->isSized()) {
|
||||
SmallVector<Value*, 8> NewIndices;
|
||||
|
||||
// Start with the index over the outer type.
|
||||
// Start with the index over the outer type. Note that the type size
|
||||
// might be zero (even if the offset isn't zero) if the indexed type
|
||||
// is something like [0 x {int, int}]
|
||||
const Type *IntPtrTy = TD->getIntPtrType();
|
||||
int64_t TySize = TD->getTypeSize(GEPIdxTy);
|
||||
int64_t FirstIdx = Offset/TySize;
|
||||
Offset %= TySize;
|
||||
int64_t FirstIdx = 0;
|
||||
if (int64_t TySize = TD->getTypeSize(GEPIdxTy)) {
|
||||
FirstIdx = Offset/TySize;
|
||||
Offset %= TySize;
|
||||
|
||||
// Handle silly modulus not returning values values [0..TySize).
|
||||
if (Offset < 0) {
|
||||
--FirstIdx;
|
||||
Offset += TySize;
|
||||
assert(Offset >= 0);
|
||||
// Handle silly modulus not returning values values [0..TySize).
|
||||
if (Offset < 0) {
|
||||
--FirstIdx;
|
||||
Offset += TySize;
|
||||
assert(Offset >= 0);
|
||||
}
|
||||
assert((uint64_t)Offset < (uint64_t)TySize && "Out of range offset");
|
||||
}
|
||||
|
||||
NewIndices.push_back(ConstantInt::get(IntPtrTy, FirstIdx));
|
||||
assert((uint64_t)Offset < (uint64_t)TySize && "Out of range offset");
|
||||
|
||||
// Index into the types. If we fail, set OrigBase to null.
|
||||
while (Offset) {
|
||||
|
Loading…
Reference in New Issue
Block a user