mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
Remove the code which constant-folded ptrtoint(inttoptr(x)+c) to
getelementptr. Despite only doing so in the case where x is a known array object and c can be converted to an index within range, this could still be invalid if c is actually the address of an object allocated outside of LLVM. Also, SCEVExpander, the original motivation for this code, has since been improved to avoid inttoptr+ptroint in more cases. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96950 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -783,44 +783,12 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, const Type *DestTy,
|
||||
// If the input is a ptrtoint, turn the pair into a ptr to ptr bitcast if
|
||||
// the int size is >= the ptr size. This requires knowing the width of a
|
||||
// pointer, so it can't be done in ConstantExpr::getCast.
|
||||
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0])) {
|
||||
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0]))
|
||||
if (TD &&
|
||||
TD->getPointerSizeInBits() <=
|
||||
CE->getType()->getScalarSizeInBits()) {
|
||||
if (CE->getOpcode() == Instruction::PtrToInt)
|
||||
return FoldBitCast(CE->getOperand(0), DestTy, *TD);
|
||||
|
||||
// If there's a constant offset added to the integer value before
|
||||
// it is casted back to a pointer, see if the expression can be
|
||||
// converted into a GEP.
|
||||
if (CE->getOpcode() == Instruction::Add)
|
||||
if (ConstantInt *L = dyn_cast<ConstantInt>(CE->getOperand(1)))
|
||||
if (ConstantExpr *R = dyn_cast<ConstantExpr>(CE->getOperand(0)))
|
||||
if (R->getOpcode() == Instruction::PtrToInt)
|
||||
if (GlobalVariable *GV =
|
||||
dyn_cast<GlobalVariable>(R->getOperand(0))) {
|
||||
const PointerType *GVTy = cast<PointerType>(GV->getType());
|
||||
if (const ArrayType *AT =
|
||||
dyn_cast<ArrayType>(GVTy->getElementType())) {
|
||||
const Type *ElTy = AT->getElementType();
|
||||
uint64_t AllocSize = TD->getTypeAllocSize(ElTy);
|
||||
APInt PSA(L->getValue().getBitWidth(), AllocSize);
|
||||
if (ElTy == cast<PointerType>(DestTy)->getElementType() &&
|
||||
L->getValue().urem(PSA) == 0) {
|
||||
APInt ElemIdx = L->getValue().udiv(PSA);
|
||||
if (ElemIdx.ult(APInt(ElemIdx.getBitWidth(),
|
||||
AT->getNumElements()))) {
|
||||
Constant *Index[] = {
|
||||
Constant::getNullValue(CE->getType()),
|
||||
ConstantInt::get(ElTy->getContext(), ElemIdx)
|
||||
};
|
||||
return ConstantExpr::getGetElementPtr(GV, &Index[0], 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
TD->getPointerSizeInBits() <= CE->getType()->getScalarSizeInBits() &&
|
||||
CE->getOpcode() == Instruction::PtrToInt)
|
||||
return FoldBitCast(CE->getOperand(0), DestTy, *TD);
|
||||
|
||||
return ConstantExpr::getCast(Opcode, Ops[0], DestTy);
|
||||
case Instruction::Trunc:
|
||||
case Instruction::ZExt:
|
||||
|
Reference in New Issue
Block a user