[llvm] [InstCombine] Offset both sides of an equality icmp (PR #134086)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 27 08:36:17 PDT 2025
================
@@ -628,3 +628,150 @@ define i1 @icmp_slt_select(i1 %cond, i32 %a, i32 %b) {
%res = icmp slt i32 %lhs, %rhs
ret i1 %res
}
+
+define i1 @discr_eq(i8 %a, i8 %b) {
+; CHECK-LABEL: @discr_eq(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A:%.*]], 1
+; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B:%.*]], 1
+; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[A]], i8 3
+; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i8 [[B]], i8 3
+; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[SEL1]], [[SEL2]]
+; CHECK-NEXT: ret i1 [[RES]]
+;
+entry:
+ %add1 = add i8 %a, -2
+ %cmp1 = icmp ugt i8 %a, 1
+ %sel1 = select i1 %cmp1, i8 %add1, i8 1
+ %add2 = add i8 %b, -2
+ %cmp2 = icmp ugt i8 %b, 1
+ %sel2 = select i1 %cmp2, i8 %add2, i8 1
+ %res = icmp eq i8 %sel1, %sel2
+ ret i1 %res
+}
+
+define i1 @discr_ne(i8 %a, i8 %b) {
+; CHECK-LABEL: @discr_ne(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A:%.*]], 1
+; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B:%.*]], 1
+; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[A]], i8 3
+; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i8 [[B]], i8 3
+; CHECK-NEXT: [[RES:%.*]] = icmp ne i8 [[SEL1]], [[SEL2]]
+; CHECK-NEXT: ret i1 [[RES]]
+;
+entry:
+ %add1 = add i8 %a, -2
+ %cmp1 = icmp ugt i8 %a, 1
+ %sel1 = select i1 %cmp1, i8 %add1, i8 1
+ %add2 = add i8 %b, -2
+ %cmp2 = icmp ugt i8 %b, 1
+ %sel2 = select i1 %cmp2, i8 %add2, i8 1
+ %res = icmp ne i8 %sel1, %sel2
+ ret i1 %res
+}
+
+define i1 @discr_xor_eq(i8 %a, i8 %b) {
+; CHECK-LABEL: @discr_xor_eq(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A:%.*]], 1
+; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B:%.*]], 1
+; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP1]], i8 [[A]], i8 -4
+; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[CMP2]], i8 [[B]], i8 -4
+; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]]
+; CHECK-NEXT: ret i1 [[RES]]
+;
+entry:
+ %xor1 = xor i8 %a, -3
+ %cmp1 = icmp ugt i8 %a, 1
+ %sel1 = select i1 %cmp1, i8 %xor1, i8 1
+ %xor2 = xor i8 %b, -3
+ %cmp2 = icmp ugt i8 %b, 1
+ %sel2 = select i1 %cmp2, i8 %xor2, i8 1
+ %res = icmp eq i8 %sel1, %sel2
+ ret i1 %res
+}
+
+define i1 @discr_eq_simple(i8 %a, i8 %b) {
+; CHECK-LABEL: @discr_eq_simple(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A:%.*]], 1
+; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[A]], i8 3
+; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[SEL1]], [[ADD2:%.*]]
----------------
nikic wrote:
Something here is weird, why does this reference a nowhere defined ADD2 value?
https://github.com/llvm/llvm-project/pull/134086
More information about the llvm-commits
mailing list