diff options
| author | Chris Lattner <sabre@nondot.org> | 2007-05-05 22:41:33 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2007-05-05 22:41:33 +0000 |
| commit | 5aa73fe34c3a97a9de579f5643e19cb0678dccf7 (patch) | |
| tree | f4f29836adae4d9bd205514f249c84457fedecb3 /llvm/lib/Transforms | |
| parent | 3dde023021456543a3b388ffa086b1d115a6959d (diff) | |
| download | bcm5719-llvm-5aa73fe34c3a97a9de579f5643e19cb0678dccf7.tar.gz bcm5719-llvm-5aa73fe34c3a97a9de579f5643e19cb0678dccf7.zip | |
Implement Transforms/InstCombine/cast_ptr.ll
llvm-svn: 36809
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index efeb8344b97..672fe852e69 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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; |

