[llvm] [InstSimplify] Add simplification for `({u,s}rem (mul {nuw,nsw} X, C1), C0)` (PR #97037)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 28 06:47:44 PDT 2024
================
@@ -488,3 +490,54 @@ define i8 @urem_mul_sdiv(i8 %x, i8 %y) {
%mod = urem i8 %mul, %y
ret i8 %mod
}
+
+define <2 x i8> @simplfy_srem_of_mul(<2 x i8> %x) {
+; CHECK-LABEL: @simplfy_srem_of_mul(
+; CHECK-NEXT: ret <2 x i8> zeroinitializer
+;
+ %mul = mul nsw <2 x i8> %x, <i8 20, i8 10>
+ %r = srem <2 x i8> %mul, <i8 5, i8 5>
+ ret <2 x i8> %r
+}
+
+define <2 x i8> @simplfy_srem_of_mul_fail_bad_mod(<2 x i8> %x) {
+; CHECK-LABEL: @simplfy_srem_of_mul_fail_bad_mod(
+; CHECK-NEXT: [[MUL:%.*]] = mul nsw <2 x i8> [[X:%.*]], <i8 20, i8 11>
+; CHECK-NEXT: [[R:%.*]] = srem <2 x i8> [[MUL]], <i8 5, i8 5>
+; CHECK-NEXT: ret <2 x i8> [[R]]
+;
+ %mul = mul nsw <2 x i8> %x, <i8 20, i8 11>
+ %r = srem <2 x i8> %mul, <i8 5, i8 5>
+ ret <2 x i8> %r
+}
+
+define i8 @simplfy_urem_of_mul(i8 %x) {
+; CHECK-LABEL: @simplfy_urem_of_mul(
+; CHECK-NEXT: ret i8 0
+;
+ %mul = mul nuw i8 %x, 30
+ %r = urem i8 %mul, 10
+ ret i8 %r
+}
+
+define i8 @simplfy_urem_of_mul_fail_bad_flag(i8 %x) {
+; CHECK-LABEL: @simplfy_urem_of_mul_fail_bad_flag(
+; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X:%.*]], 30
+; CHECK-NEXT: [[R:%.*]] = urem i8 [[MUL]], 10
+; CHECK-NEXT: ret i8 [[R]]
+;
+ %mul = mul nsw i8 %x, 30
+ %r = urem i8 %mul, 10
+ ret i8 %r
+}
+
+define i8 @simplfy_urem_of_mul_fail_bad_mod(i8 %x) {
+; CHECK-LABEL: @simplfy_urem_of_mul_fail_bad_mod(
+; CHECK-NEXT: [[MUL:%.*]] = mul nsw i8 [[X:%.*]], 31
+; CHECK-NEXT: [[R:%.*]] = urem i8 [[MUL]], 10
+; CHECK-NEXT: ret i8 [[R]]
+;
+ %mul = mul nsw i8 %x, 31
----------------
nikic wrote:
```suggestion
%mul = mul nuw i8 %x, 31
```
Otherwise this is not a "bad_mod" test.
https://github.com/llvm/llvm-project/pull/97037
More information about the llvm-commits
mailing list