[llvm] Simplify `(a % b) lt/ge (b-1)` into `(a % b) eq/ne (b-1)` (PR #72504)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 15 09:49:27 PST 2024


================
@@ -10,6 +10,307 @@ declare void @use_i8(i8)
 declare void @use_i32(i32)
 declare void @use_i64(i64)
 
+; tests for (x % c) >=/ < (c - 1), where c >= 0
+define i1 @srem_sgt_test1(i64 %x) {
+; CHECK-LABEL: @srem_sgt_test1(
+; CHECK-NEXT:    [[Y:%.*]] = srem i64 [[X:%.*]], 34360750831
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[Y]], 34360750830
+; CHECK-NEXT:    ret i1 [[CMP]]
+;
+  %y = srem i64 %x, 34360750831
+  %cmp = icmp sgt i64 %y, 34360750829
+  ret i1 %cmp
+}
+
+define i1 @srem_slt_test1(i64 %x) {
+; CHECK-LABEL: @srem_slt_test1(
+; CHECK-NEXT:    [[Y:%.*]] = srem i64 [[X:%.*]], 34360750831
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i64 [[Y]], 34360750830
+; CHECK-NEXT:    ret i1 [[CMP]]
+;
+  %y = srem i64 %x, 34360750831
+  %cmp = icmp slt i64 %y, 34360750830
+  ret i1 %cmp
+}
+
+define i1 @srem_sgt_test2(i32 %x) {
+; CHECK-LABEL: @srem_sgt_test2(
+; CHECK-NEXT:    [[Y:%.*]] = srem i32 [[X:%.*]], 1074977277
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[Y]], 1074977276
+; CHECK-NEXT:    ret i1 [[CMP]]
+;
+  %y = srem i32 %x, 1074977277
+  %cmp = icmp sgt i32 %y, 1074977275
+  ret i1 %cmp
+}
+
+define i1 @srem_slt_test2(i32 %x) {
+; CHECK-LABEL: @srem_slt_test2(
+; CHECK-NEXT:    [[Y:%.*]] = srem i32 [[X:%.*]], 1074977277
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[Y]], 1074977276
+; CHECK-NEXT:    ret i1 [[CMP]]
+;
+  %y = srem i32 %x, 1074977277
+  %cmp = icmp slt i32 %y, 1074977276
+  ret i1 %cmp
+}
+
+define i1 @srem_sgt_test3(i16 %x) {
+; CHECK-LABEL: @srem_sgt_test3(
+; CHECK-NEXT:    [[Y:%.*]] = srem i16 [[X:%.*]], 2259
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 [[Y]], 2258
+; CHECK-NEXT:    ret i1 [[CMP]]
+;
+  %y = srem i16 %x, 2259
+  %cmp = icmp sgt i16 %y, 2257
+  ret i1 %cmp
+}
+
+define i1 @srem_slt_test3(i16 %x) {
+; CHECK-LABEL: @srem_slt_test3(
+; CHECK-NEXT:    [[Y:%.*]] = srem i16 [[X:%.*]], 2259
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i16 [[Y]], 2258
+; CHECK-NEXT:    ret i1 [[CMP]]
+;
+  %y = srem i16 %x, 2259
+  %cmp = icmp slt i16 %y, 2258
+  ret i1 %cmp
+}
+
+define i1 @srem_sgt_test4(i8 %x) {
+; CHECK-LABEL: @srem_sgt_test4(
+; CHECK-NEXT:    ret i1 true
+;
+  %y = srem i8 %x, 133
+  %cmp = icmp sgt i8 %y, 131
+  ret i1 %cmp
+}
----------------
nikic wrote:

I found this test pretty confusing. Is the fact that `i8 133` overflows into a negative number here intentional?

https://github.com/llvm/llvm-project/pull/72504


More information about the llvm-commits mailing list