[InstCombine] Fold icmp pred (inttoptr X), (inttoptr Y) -> icmp pred X, Y (#77832)

NOTE: Alive2 proofs are unavailable because `inttoptr` is unsupported.
This commit is contained in:
Yingwei Zheng 2024-01-12 23:03:07 +08:00 committed by GitHub
parent d199ab4699
commit 2aae304cbc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 0 deletions

View File

@ -5703,6 +5703,15 @@ Instruction *InstCombinerImpl::foldICmpWithCastOp(ICmpInst &ICmp) {
return new ICmpInst(ICmp.getPredicate(), Op0Src, NewOp1);
}
// Turn icmp pred (inttoptr x), (inttoptr y) into icmp pred x, y
if (CastOp0->getOpcode() == Instruction::IntToPtr &&
CompatibleSizes(DestTy, SrcTy)) {
Value *Op1Src;
if (match(ICmp.getOperand(1), m_IntToPtr(m_Value(Op1Src))) &&
Op1Src->getType() == SrcTy)
return new ICmpInst(ICmp.getPredicate(), Op0Src, Op1Src);
}
if (Instruction *R = foldICmpWithTrunc(ICmp))
return R;

View File

@ -113,6 +113,51 @@ define i1 @test4(i32 %A) {
ret i1 %C
}
define i1 @test4_icmp_with_var(i32 %A1, i32 %A2) {
; CHECK-LABEL: @test4_icmp_with_var(
; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[A1:%.*]], [[A2:%.*]]
; CHECK-NEXT: ret i1 [[C]]
;
%B1 = inttoptr i32 %A1 to ptr
%B2 = inttoptr i32 %A2 to ptr
%C = icmp ugt ptr %B1, %B2
ret i1 %C
}
define i1 @test4_cmp_with_nonnull_constant(i32 %A) {
; CHECK-LABEL: @test4_cmp_with_nonnull_constant(
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[A:%.*]], 1
; CHECK-NEXT: ret i1 [[C]]
;
%B = inttoptr i32 %A to ptr
%C = icmp eq ptr %B, inttoptr (i32 1 to ptr)
ret i1 %C
}
define i1 @test4_cmp_eq_0_or_1(i32 %x) {
; CHECK-LABEL: @test4_cmp_eq_0_or_1(
; CHECK-NEXT: [[OR:%.*]] = icmp ult i32 [[X:%.*]], 2
; CHECK-NEXT: ret i1 [[OR]]
;
%cast = inttoptr i32 %x to ptr
%tobool = icmp eq i32 %x, 0
%cmp = icmp eq ptr %cast, inttoptr (i32 1 to ptr)
%or = or i1 %tobool, %cmp
ret i1 %or
}
define i1 @test4_icmp_with_var_mismatched_type(i32 %A1, i64 %A2) {
; CHECK-LABEL: @test4_icmp_with_var_mismatched_type(
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[A2:%.*]] to i32
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], [[A1:%.*]]
; CHECK-NEXT: ret i1 [[C]]
;
%B1 = inttoptr i32 %A1 to ptr
%B2 = inttoptr i64 %A2 to ptr
%C = icmp ugt ptr %B1, %B2
ret i1 %C
}
define i1 @test4_as2(i16 %A) {
; CHECK-LABEL: @test4_as2(
; CHECK-NEXT: [[C:%.*]] = icmp eq i16 [[A:%.*]], 0