[llvm] 1145694 - [InstCombine] Add tests for folding `(mul (div exact X, C0), C1)`; NFC
Noah Goldstein via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 28 01:52:20 PDT 2024
Author: Noah Goldstein
Date: 2024-06-28T16:52:03+08:00
New Revision: 11456944d481b5d1b139e346ea7992c0b692781a
URL: https://github.com/llvm/llvm-project/commit/11456944d481b5d1b139e346ea7992c0b692781a
DIFF: https://github.com/llvm/llvm-project/commit/11456944d481b5d1b139e346ea7992c0b692781a.diff
LOG: [InstCombine] Add tests for folding `(mul (div exact X, C0), C1)`; NFC
Added:
Modified:
llvm/test/Transforms/InstCombine/exact.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/exact.ll b/llvm/test/Transforms/InstCombine/exact.ll
index 10d46e7b2dfb3..f4eb86cadc70a 100644
--- a/llvm/test/Transforms/InstCombine/exact.ll
+++ b/llvm/test/Transforms/InstCombine/exact.ll
@@ -120,7 +120,7 @@ define i1 @ashr_icmp1(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], 0
; CHECK-NEXT: ret i1 [[B]]
;
- %A = ashr exact i64 %X, 2 ; X/4
+ %A = ashr exact i64 %X, 2 ; X/4
%B = icmp eq i64 %A, 0
ret i1 %B
}
@@ -131,7 +131,7 @@ define i1 @ashr_icmp2(i64 %X) {
; CHECK-NEXT: ret i1 [[Z]]
;
%Y = ashr exact i64 %X, 2 ; x / 4
- %Z = icmp slt i64 %Y, 4 ; x < 16
+ %Z = icmp slt i64 %Y, 4 ; x < 16
ret i1 %Z
}
@@ -181,7 +181,7 @@ define i1 @udiv_icmp1(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp ne i64 [[X:%.*]], 0
; CHECK-NEXT: ret i1 [[B]]
;
- %A = udiv exact i64 %X, 5 ; X/5
+ %A = udiv exact i64 %X, 5 ; X/5
%B = icmp ne i64 %A, 0
ret i1 %B
}
@@ -201,7 +201,7 @@ define i1 @udiv_icmp2(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], 0
; CHECK-NEXT: ret i1 [[B]]
;
- %A = udiv exact i64 %X, 5 ; X/5 == 0 --> x == 0
+ %A = udiv exact i64 %X, 5 ; X/5 == 0 --> x == 0
%B = icmp eq i64 %A, 0
ret i1 %B
}
@@ -221,7 +221,7 @@ define i1 @sdiv_icmp1(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], 0
; CHECK-NEXT: ret i1 [[B]]
;
- %A = sdiv exact i64 %X, 5 ; X/5 == 0 --> x == 0
+ %A = sdiv exact i64 %X, 5 ; X/5 == 0 --> x == 0
%B = icmp eq i64 %A, 0
ret i1 %B
}
@@ -241,7 +241,7 @@ define i1 @sdiv_icmp2(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], 5
; CHECK-NEXT: ret i1 [[B]]
;
- %A = sdiv exact i64 %X, 5 ; X/5 == 1 --> x == 5
+ %A = sdiv exact i64 %X, 5 ; X/5 == 1 --> x == 5
%B = icmp eq i64 %A, 1
ret i1 %B
}
@@ -261,7 +261,7 @@ define i1 @sdiv_icmp3(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], -5
; CHECK-NEXT: ret i1 [[B]]
;
- %A = sdiv exact i64 %X, 5 ; X/5 == -1 --> x == -5
+ %A = sdiv exact i64 %X, 5 ; X/5 == -1 --> x == -5
%B = icmp eq i64 %A, -1
ret i1 %B
}
@@ -281,7 +281,7 @@ define i1 @sdiv_icmp4(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], 0
; CHECK-NEXT: ret i1 [[B]]
;
- %A = sdiv exact i64 %X, -5 ; X/-5 == 0 --> x == 0
+ %A = sdiv exact i64 %X, -5 ; X/-5 == 0 --> x == 0
%B = icmp eq i64 %A, 0
ret i1 %B
}
@@ -301,7 +301,7 @@ define i1 @sdiv_icmp5(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], -5
; CHECK-NEXT: ret i1 [[B]]
;
- %A = sdiv exact i64 %X, -5 ; X/-5 == 1 --> x == -5
+ %A = sdiv exact i64 %X, -5 ; X/-5 == 1 --> x == -5
%B = icmp eq i64 %A, 1
ret i1 %B
}
@@ -321,7 +321,7 @@ define i1 @sdiv_icmp6(i64 %X) {
; CHECK-NEXT: [[B:%.*]] = icmp eq i64 [[X:%.*]], 5
; CHECK-NEXT: ret i1 [[B]]
;
- %A = sdiv exact i64 %X, -5 ; X/-5 == -1 --> x == 5
+ %A = sdiv exact i64 %X, -5 ; X/-5 == -1 --> x == 5
%B = icmp eq i64 %A, -1
ret i1 %B
}
@@ -336,3 +336,78 @@ define <2 x i1> @sdiv_icmp6_vec(<2 x i64> %X) {
ret <2 x i1> %B
}
+define i8 @mul_of_udiv(i8 %x) {
+; CHECK-LABEL: @mul_of_udiv(
+; CHECK-NEXT: [[DIV:%.*]] = udiv exact i8 [[X:%.*]], 12
+; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[DIV]], 6
+; CHECK-NEXT: ret i8 [[MUL]]
+;
+ %div = udiv exact i8 %x, 12
+ %mul = mul i8 %div, 6
+ ret i8 %mul
+}
+
+define i8 @mul_of_sdiv(i8 %x) {
+; CHECK-LABEL: @mul_of_sdiv(
+; CHECK-NEXT: [[DIV:%.*]] = sdiv exact i8 [[X:%.*]], 12
+; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[DIV]], -6
+; CHECK-NEXT: ret i8 [[MUL]]
+;
+ %div = sdiv exact i8 %x, 12
+ %mul = mul i8 %div, -6
+ ret i8 %mul
+}
+
+define <2 x i8> @mul_of_sdiv_non_splat(<2 x i8> %x) {
+; CHECK-LABEL: @mul_of_sdiv_non_splat(
+; CHECK-NEXT: [[DIV:%.*]] = sdiv exact <2 x i8> [[X:%.*]], <i8 6, i8 -12>
+; CHECK-NEXT: [[MUL:%.*]] = mul <2 x i8> [[DIV]], <i8 6, i8 6>
+; CHECK-NEXT: ret <2 x i8> [[MUL]]
+;
+ %div = sdiv exact <2 x i8> %x, <i8 6, i8 -12>
+ %mul = mul <2 x i8> %div, <i8 6, i8 6>
+ ret <2 x i8> %mul
+}
+
+define i8 @mul_of_sdiv_fail_missing_exact(i8 %x) {
+; CHECK-LABEL: @mul_of_sdiv_fail_missing_exact(
+; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], 12
+; CHECK-NEXT: [[MUL:%.*]] = mul i8 [[DIV]], -6
+; CHECK-NEXT: ret i8 [[MUL]]
+;
+ %div = sdiv i8 %x, 12
+ %mul = mul i8 %div, -6
+ ret i8 %mul
+}
+
+define i8 @mul_of_udiv_fail_bad_remainder(i8 %x) {
+; CHECK-LABEL: @mul_of_udiv_fail_bad_remainder(
+; CHECK-NEXT: [[DIV:%.*]] = udiv exact i8 [[X:%.*]], 11
+; CHECK-NEXT: [[MUL:%.*]] = mul nuw i8 [[DIV]], 6
+; CHECK-NEXT: ret i8 [[MUL]]
+;
+ %div = udiv exact i8 %x, 11
+ %mul = mul i8 %div, 6
+ ret i8 %mul
+}
+
+define i8 @mul_of_sdiv_fail_ub(i8 %x) {
+; CHECK-LABEL: @mul_of_sdiv_fail_ub(
+; CHECK-NEXT: [[MUL:%.*]] = sub i8 0, [[X:%.*]]
+; CHECK-NEXT: ret i8 [[MUL]]
+;
+ %div = sdiv exact i8 %x, 6
+ %mul = mul i8 %div, -6
+ ret i8 %mul
+}
+
+define <2 x i8> @mul_of_sdiv_fail_ub_non_splat(<2 x i8> %x) {
+; CHECK-LABEL: @mul_of_sdiv_fail_ub_non_splat(
+; CHECK-NEXT: [[DIV:%.*]] = sdiv exact <2 x i8> [[X:%.*]], <i8 -6, i8 -12>
+; CHECK-NEXT: [[MUL:%.*]] = mul <2 x i8> [[DIV]], <i8 6, i8 6>
+; CHECK-NEXT: ret <2 x i8> [[MUL]]
+;
+ %div = sdiv exact <2 x i8> %x, <i8 -6, i8 -12>
+ %mul = mul <2 x i8> %div, <i8 6, i8 6>
+ ret <2 x i8> %mul
+}
More information about the llvm-commits
mailing list