mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-26 18:20:39 +00:00
canonicalize inttoptr and ptrtoint instructions which cast pointers
to/from integer types that are not intptr_t to convert to intptr_t then do an integer conversion to the dest type. This exposes the cast to the optimizer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67638 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -218,7 +218,7 @@ namespace {
|
|||||||
Instruction *visitFPToSI(FPToSIInst &FI);
|
Instruction *visitFPToSI(FPToSIInst &FI);
|
||||||
Instruction *visitUIToFP(CastInst &CI);
|
Instruction *visitUIToFP(CastInst &CI);
|
||||||
Instruction *visitSIToFP(CastInst &CI);
|
Instruction *visitSIToFP(CastInst &CI);
|
||||||
Instruction *visitPtrToInt(CastInst &CI);
|
Instruction *visitPtrToInt(PtrToIntInst &CI);
|
||||||
Instruction *visitIntToPtr(IntToPtrInst &CI);
|
Instruction *visitIntToPtr(IntToPtrInst &CI);
|
||||||
Instruction *visitBitCast(BitCastInst &CI);
|
Instruction *visitBitCast(BitCastInst &CI);
|
||||||
Instruction *FoldSelectOpOp(SelectInst &SI, Instruction *TI,
|
Instruction *FoldSelectOpOp(SelectInst &SI, Instruction *TI,
|
||||||
@@ -474,9 +474,16 @@ isEliminableCastPair(
|
|||||||
Instruction::CastOps firstOp = Instruction::CastOps(CI->getOpcode());
|
Instruction::CastOps firstOp = Instruction::CastOps(CI->getOpcode());
|
||||||
Instruction::CastOps secondOp = Instruction::CastOps(opcode);
|
Instruction::CastOps secondOp = Instruction::CastOps(opcode);
|
||||||
|
|
||||||
return Instruction::CastOps(
|
unsigned Res = CastInst::isEliminableCastPair(firstOp, secondOp, SrcTy, MidTy,
|
||||||
CastInst::isEliminableCastPair(firstOp, secondOp, SrcTy, MidTy,
|
DstTy, TD->getIntPtrType());
|
||||||
DstTy, TD->getIntPtrType()));
|
|
||||||
|
// We don't want to form an inttoptr or ptrtoint that converts to an integer
|
||||||
|
// type that differs from the pointer size.
|
||||||
|
if ((Res == Instruction::IntToPtr && SrcTy != TD->getIntPtrType()) ||
|
||||||
|
(Res == Instruction::PtrToInt && DstTy != TD->getIntPtrType()))
|
||||||
|
Res = 0;
|
||||||
|
|
||||||
|
return Instruction::CastOps(Res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ValueRequiresCast - Return true if the cast from "V to Ty" actually results
|
/// ValueRequiresCast - Return true if the cast from "V to Ty" actually results
|
||||||
@@ -8536,11 +8543,36 @@ Instruction *InstCombiner::visitSIToFP(CastInst &CI) {
|
|||||||
return commonCastTransforms(CI);
|
return commonCastTransforms(CI);
|
||||||
}
|
}
|
||||||
|
|
||||||
Instruction *InstCombiner::visitPtrToInt(CastInst &CI) {
|
Instruction *InstCombiner::visitPtrToInt(PtrToIntInst &CI) {
|
||||||
|
// If the destination integer type is smaller than the intptr_t type for
|
||||||
|
// this target, do a ptrtoint to intptr_t then do a trunc. This allows the
|
||||||
|
// trunc to be exposed to other transforms. Don't do this for extending
|
||||||
|
// ptrtoint's, because we don't know if the target sign or zero extends its
|
||||||
|
// pointers.
|
||||||
|
if (CI.getType()->getPrimitiveSizeInBits() < TD->getPointerSizeInBits()) {
|
||||||
|
Value *P = InsertNewInstBefore(new PtrToIntInst(CI.getOperand(0),
|
||||||
|
TD->getIntPtrType(),
|
||||||
|
"tmp"), CI);
|
||||||
|
return new TruncInst(P, CI.getType());
|
||||||
|
}
|
||||||
|
|
||||||
return commonPointerCastTransforms(CI);
|
return commonPointerCastTransforms(CI);
|
||||||
}
|
}
|
||||||
|
|
||||||
Instruction *InstCombiner::visitIntToPtr(IntToPtrInst &CI) {
|
Instruction *InstCombiner::visitIntToPtr(IntToPtrInst &CI) {
|
||||||
|
// If the source integer type is larger than the intptr_t type for
|
||||||
|
// this target, do a trunc to the intptr_t type, then inttoptr of it. This
|
||||||
|
// allows the trunc to be exposed to other transforms. Don't do this for
|
||||||
|
// extending inttoptr's, because we don't know if the target sign or zero
|
||||||
|
// extends to pointers.
|
||||||
|
if (CI.getOperand(0)->getType()->getPrimitiveSizeInBits() >
|
||||||
|
TD->getPointerSizeInBits()) {
|
||||||
|
Value *P = InsertNewInstBefore(new TruncInst(CI.getOperand(0),
|
||||||
|
TD->getIntPtrType(),
|
||||||
|
"tmp"), CI);
|
||||||
|
return new IntToPtrInst(P, CI.getType());
|
||||||
|
}
|
||||||
|
|
||||||
if (Instruction *I = commonCastTransforms(CI))
|
if (Instruction *I = commonCastTransforms(CI))
|
||||||
return I;
|
return I;
|
||||||
|
|
||||||
|
|||||||
16
test/Transforms/InstCombine/ptr-int-cast.ll
Normal file
16
test/Transforms/InstCombine/ptr-int-cast.ll
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
; RUN: llvm-as < %s | opt -instcombine | llvm-dis > %t
|
||||||
|
|
||||||
|
define i1 @test1(i32 *%x) nounwind {
|
||||||
|
entry:
|
||||||
|
; RUN: grep {ptrtoint i32\\* %x to i64} %t
|
||||||
|
%tmp = ptrtoint i32* %x to i1
|
||||||
|
ret i1 %tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32* @test2(i128 %x) nounwind {
|
||||||
|
entry:
|
||||||
|
; RUN: grep {inttoptr i64 %.mp1 to i32\\*} %t
|
||||||
|
%tmp = inttoptr i128 %x to i32*
|
||||||
|
ret i32* %tmp
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user