mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Revert "Remove an InstCombine that seems to have become redundant."
Assertion fires in compiler-rt. Guess it does fire.. This reverts commit r233116. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233121 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
45eaa023df
commit
ef9962d9bb
@ -1455,20 +1455,35 @@ Instruction *InstCombiner::commonPointerCastTransforms(CastInst &CI) {
|
||||
// GEP computes a constant offset, see if we can convert these three
|
||||
// instructions into fewer. This typically happens with unions and other
|
||||
// non-type-safe code.
|
||||
// Looks like this never actually fires due to bitcast+gep folding happening
|
||||
// in InstCombiner::visitGetElementPtrInst where the bitcast operand to a
|
||||
// gep is folded into the gep if possible, before we consider whether that
|
||||
// gep is used in a bitcast as well.
|
||||
// Let's assert that this wouldn't fire just to be sure.
|
||||
#ifndef NDEBUG
|
||||
APInt Offset(DL.getPointerSizeInBits(GEP->getPointerAddressSpace()), 0);
|
||||
unsigned AS = GEP->getPointerAddressSpace();
|
||||
unsigned OffsetBits = DL.getPointerSizeInBits(AS);
|
||||
APInt Offset(OffsetBits, 0);
|
||||
BitCastInst *BCI = dyn_cast<BitCastInst>(GEP->getOperand(0));
|
||||
SmallVector<Value *, 8> NewIndices;
|
||||
assert(!BCI || !GEP->hasOneUse() ||
|
||||
!GEP->accumulateConstantOffset(DL, Offset) ||
|
||||
!FindElementAtOffset(BCI->getOperand(0)->getType(),
|
||||
Offset.getSExtValue(), NewIndices));
|
||||
#endif
|
||||
if (GEP->hasOneUse() && BCI && GEP->accumulateConstantOffset(DL, Offset)) {
|
||||
// FIXME: This is insufficiently tested - just a no-crash test
|
||||
// (test/Transforms/InstCombine/2007-05-14-Crash.ll)
|
||||
//
|
||||
// Get the base pointer input of the bitcast, and the type it points to.
|
||||
Value *OrigBase = BCI->getOperand(0);
|
||||
SmallVector<Value*, 8> NewIndices;
|
||||
if (FindElementAtOffset(OrigBase->getType(), Offset.getSExtValue(),
|
||||
NewIndices)) {
|
||||
// FIXME: This codepath is completely untested - could be unreachable
|
||||
// for all I know.
|
||||
// If we were able to index down into an element, create the GEP
|
||||
// and bitcast the result. This eliminates one bitcast, potentially
|
||||
// two.
|
||||
Value *NGEP = cast<GEPOperator>(GEP)->isInBounds() ?
|
||||
Builder->CreateInBoundsGEP(OrigBase, NewIndices) :
|
||||
Builder->CreateGEP(OrigBase, NewIndices);
|
||||
NGEP->takeName(GEP);
|
||||
|
||||
if (isa<BitCastInst>(CI))
|
||||
return new BitCastInst(NGEP, CI.getType());
|
||||
assert(isa<PtrToIntInst>(CI));
|
||||
return new PtrToIntInst(NGEP, CI.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return commonCastTransforms(CI);
|
||||
|
@ -15,10 +15,4 @@ entry:
|
||||
ret i8* %tmp35
|
||||
}
|
||||
|
||||
define i32* @bar(%struct.abc* %abc) {
|
||||
entry:
|
||||
%tmp1 = bitcast %struct.abc* %abc to %struct.def*
|
||||
%tmp3 = getelementptr %struct.def, %struct.def* %tmp1, i32 0, i32 1
|
||||
%tmp35 = bitcast %struct.abc* %tmp3 to i32*
|
||||
ret i32* %tmp35
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user