[llvm] [InstCombine] Generalize `(A + 1) + ~B` fold to any constant (PR #188271)
Ricardo Jesus via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 10 03:03:54 PDT 2026
================
@@ -21,6 +21,43 @@ define i32 @t0(i32 %x, i32 %y) {
ret i32 %t2
}
+define i32 @t12(i32 %x, i32 %y) {
+; CHECK-LABEL: @t12(
+; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[Y:%.*]], [[X:%.*]]
+; CHECK-NEXT: [[T2:%.*]] = add i32 [[TMP1]], 1
+; CHECK-NEXT: ret i32 [[T2]]
+;
+ %t0 = xor i32 %x, -1
+ %t1 = add i32 %t0, %y
+ %t2 = add i32 %t1, 2
+ ret i32 %t2
+}
+
+define i32 @add_not_add_m1(i32 %a, i32 %b) {
+; CHECK-LABEL: @add_not_add_m1(
+; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT: [[R:%.*]] = add i32 [[TMP1]], -2
+; CHECK-NEXT: ret i32 [[R]]
+;
+ %not = xor i32 %b, -1
+ %add = add i32 %a, -1
+ %r = add i32 %add, %not
+ ret i32 %r
+}
+
+define i32 @add_not_add_intmin(i32 %a, i32 %b) {
+; CHECK-LABEL: @add_not_add_intmin(
+; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[B:%.*]], -1
+; CHECK-NEXT: [[ADD:%.*]] = xor i32 [[A:%.*]], -2147483648
+; CHECK-NEXT: [[R:%.*]] = add i32 [[ADD]], [[NOT]]
+; CHECK-NEXT: ret i32 [[R]]
+;
+ %not = xor i32 %b, -1
+ %add = add i32 %a, -2147483648
+ %r = add i32 %add, %not
+ ret i32 %r
+}
----------------
rj-jesus wrote:
My suggestion would be to leave the test but add a comment explaining that this isn't combined currently because a + INT_MIN is converted to xor earlier.
https://github.com/llvm/llvm-project/pull/188271
More information about the llvm-commits
mailing list