mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-18 12:29:21 +00:00
Implement Transforms/InstCombine/cast_ptr.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36809 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a993dd0cfc
commit
8c756c1fff
@ -5593,7 +5593,28 @@ Instruction *InstCombiner::visitICmpInstWithCastAndCast(ICmpInst &ICI) {
|
||||
const Type *DestTy = LHSCI->getType();
|
||||
Value *RHSCIOp;
|
||||
|
||||
// We only handle extension cast instructions, so far. Enforce this.
|
||||
// Turn icmp (ptrtoint x), (ptrtoint/c) into a compare of the input if the
|
||||
// integer type is the same size as the pointer type.
|
||||
if (LHSCI->getOpcode() == Instruction::PtrToInt &&
|
||||
getTargetData().getPointerSizeInBits() ==
|
||||
cast<IntegerType>(DestTy)->getBitWidth()) {
|
||||
Value *RHSOp = 0;
|
||||
if (Constant *RHSC = dyn_cast<Constant>(ICI.getOperand(1))) {
|
||||
RHSOp = ConstantExpr::getPtrToInt(RHSC, SrcTy);
|
||||
} else if (PtrToIntInst *RHSC = dyn_cast<PtrToIntInst>(ICI.getOperand(1))) {
|
||||
RHSOp = RHSC->getOperand(0);
|
||||
// If the pointer types don't match, insert a bitcast.
|
||||
if (LHSCIOp->getType() != RHSOp->getType())
|
||||
RHSOp = InsertCastBefore(Instruction::BitCast, RHSOp,
|
||||
LHSCIOp->getType(), ICI);
|
||||
}
|
||||
|
||||
if (RHSOp)
|
||||
return new ICmpInst(ICI.getPredicate(), LHSCIOp, RHSOp);
|
||||
}
|
||||
|
||||
// The code below only handles extension cast instructions, so far.
|
||||
// Enforce this.
|
||||
if (LHSCI->getOpcode() != Instruction::ZExt &&
|
||||
LHSCI->getOpcode() != Instruction::SExt)
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user