mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Teach constant folding that an inttoptr of a
ptrtoint can be turned into a bitcast if the integer is at least as wide as a pointer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54752 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b0cf29c5cf
commit
81b06be055
@ -378,6 +378,19 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, const Type *DestTy,
|
||||
}
|
||||
return ConstantExpr::getCast(Opcode, Ops[0], DestTy);
|
||||
case Instruction::IntToPtr:
|
||||
// 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 (TD && CE->getOpcode() == Instruction::PtrToInt &&
|
||||
TD->getPointerSizeInBits() <=
|
||||
CE->getType()->getPrimitiveSizeInBits()) {
|
||||
Constant *Input = CE->getOperand(0);
|
||||
Constant *C = FoldBitCast(Input, DestTy, *TD);
|
||||
return C ? C : ConstantExpr::getBitCast(Input, DestTy);
|
||||
}
|
||||
}
|
||||
return ConstantExpr::getCast(Opcode, Ops[0], DestTy);
|
||||
case Instruction::Trunc:
|
||||
case Instruction::ZExt:
|
||||
case Instruction::SExt:
|
||||
|
4
test/FrontendAda/constant_fold.ads
Normal file
4
test/FrontendAda/constant_fold.ads
Normal file
@ -0,0 +1,4 @@
|
||||
-- RUN: %llvmgcc -S -emit-llvm %s -o - | not grep ptrtoint
|
||||
package Constant_Fold is
|
||||
Error : exception;
|
||||
end;
|
Loading…
Reference in New Issue
Block a user