From dc8767a49afe43b8d4bd5d9ad7e812bb662881fc Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sun, 7 Aug 2016 07:58:10 +0000 Subject: [PATCH] [InstSimplify] Try hard to simplify pointer comparisons Simplify ptrtoint comparisons involving operands with different source types. llvm-svn: 277951 --- llvm/lib/Analysis/InstructionSimplify.cpp | 10 ++++++++++ llvm/test/Transforms/InstSimplify/compare.ll | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 70f3ec0..69c60eb 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -3094,6 +3094,16 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, if (LHS->getType()->isPointerTy()) if (auto *C = computePointerICmp(Q.DL, Q.TLI, Q.DT, Pred, Q.CxtI, LHS, RHS)) return C; + if (auto *CLHS = dyn_cast(LHS)) + if (auto *CRHS = dyn_cast(RHS)) + if (Q.DL.getTypeSizeInBits(CLHS->getPointerOperandType()) == + Q.DL.getTypeSizeInBits(CLHS->getType()) && + Q.DL.getTypeSizeInBits(CRHS->getPointerOperandType()) == + Q.DL.getTypeSizeInBits(CRHS->getType())) + if (auto *C = computePointerICmp(Q.DL, Q.TLI, Q.DT, Pred, Q.CxtI, + CLHS->getPointerOperand(), + CRHS->getPointerOperand())) + return C; if (GetElementPtrInst *GLHS = dyn_cast(LHS)) { if (GEPOperator *GRHS = dyn_cast(RHS)) { diff --git a/llvm/test/Transforms/InstSimplify/compare.ll b/llvm/test/Transforms/InstSimplify/compare.ll index 5c1bbc0..bf22dbd 100644 --- a/llvm/test/Transforms/InstSimplify/compare.ll +++ b/llvm/test/Transforms/InstSimplify/compare.ll @@ -206,6 +206,19 @@ define i1 @gep16(i8* %ptr, i32 %a) { ; CHECK-NEXT: ret i1 false } +define i1 @gep17() { +; CHECK-LABEL: @gep17( + %alloca = alloca i32, align 4 + %bc = bitcast i32* %alloca to [4 x i8]* + %gep1 = getelementptr inbounds i32, i32* %alloca, i32 1 + %pti1 = ptrtoint i32* %gep1 to i32 + %gep2 = getelementptr inbounds [4 x i8], [4 x i8]* %bc, i32 0, i32 1 + %pti2 = ptrtoint i8* %gep2 to i32 + %cmp = icmp ugt i32 %pti1, %pti2 + ret i1 %cmp +; CHECK-NEXT: ret i1 true +} + define i1 @zext(i32 %x) { ; CHECK-LABEL: @zext( %e1 = zext i32 %x to i64 -- 2.7.4