[llvm] 188375f - [InstCombine] add tests for sub of min/max intrinsics; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 10 11:53:10 PDT 2021
Author: Sanjay Patel
Date: 2021-09-10T14:53:05-04:00
New Revision: 188375f478c338c020ed0069833a9323e8891d69
URL: https://github.com/llvm/llvm-project/commit/188375f478c338c020ed0069833a9323e8891d69
DIFF: https://github.com/llvm/llvm-project/commit/188375f478c338c020ed0069833a9323e8891d69.diff
LOG: [InstCombine] add tests for sub of min/max intrinsics; NFC
Added:
Modified:
llvm/test/Transforms/InstCombine/sub-minmax.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/sub-minmax.ll b/llvm/test/Transforms/InstCombine/sub-minmax.ll
index 83b210929ec1..dadcc6c2fd08 100644
--- a/llvm/test/Transforms/InstCombine/sub-minmax.ll
+++ b/llvm/test/Transforms/InstCombine/sub-minmax.ll
@@ -4,6 +4,11 @@
declare i5 @llvm.umin.i5(i5, i5)
declare <2 x i8> @llvm.umin.v2i8(<2 x i8>, <2 x i8>)
+declare i8 @llvm.smax.i8(i8, i8)
+declare i8 @llvm.smin.i8(i8, i8)
+declare i8 @llvm.umax.i8(i8, i8)
+declare i8 @llvm.umin.i8(i8, i8)
+
define i32 @max_na_b_minux_na(i32 %A, i32 %B) {
; CHECK-LABEL: @max_na_b_minux_na(
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1
@@ -388,5 +393,108 @@ define void @umin3_not_all_ops_extra_uses_invert_subs(i8 %x, i8 %y, i8 %z) {
ret void
}
+; TODO: Handle this pattern with extra uses because it shows up in benchmarks.
+; ~X - Min/Max(~X, O) -> Max/Min(X, ~O) - X
+; ~X - Min/Max(O, ~X) -> Max/Min(X, ~O) - X
+; Min/Max(~X, O) - ~X -> A - Max/Min(X, ~O)
+; Min/Max(O, ~X) - ~X -> A - Max/Min(X, ~O)
+
+define i8 @umin_not_sub_intrinsic_commute0(i8 %x, i8 %y) {
+; CHECK-LABEL: @umin_not_sub_intrinsic_commute0(
+; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
+; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
+; CHECK-NEXT: call void @use8(i8 [[NY]])
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[NX]], i8 [[NY]])
+; CHECK-NEXT: call void @use8(i8 [[M]])
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[NX]], [[M]]
+; CHECK-NEXT: ret i8 [[SUBX]]
+;
+ %nx = xor i8 %x, -1
+ %ny = xor i8 %y, -1
+ call void @use8(i8 %ny)
+ %m = call i8 @llvm.umin.i8(i8 %nx, i8 %ny)
+ call void @use8(i8 %m)
+ %subx = sub i8 %nx, %m
+ ret i8 %subx
+}
+
+define i8 @umax_not_sub_intrinsic_commute1(i8 %x, i8 %y) {
+; CHECK-LABEL: @umax_not_sub_intrinsic_commute1(
+; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
+; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
+; CHECK-NEXT: call void @use8(i8 [[NY]])
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[NY]], i8 [[NX]])
+; CHECK-NEXT: call void @use8(i8 [[M]])
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[NX]], [[M]]
+; CHECK-NEXT: ret i8 [[SUBX]]
+;
+ %nx = xor i8 %x, -1
+ %ny = xor i8 %y, -1
+ call void @use8(i8 %ny)
+ %m = call i8 @llvm.umax.i8(i8 %ny, i8 %nx)
+ call void @use8(i8 %m)
+ %subx = sub i8 %nx, %m
+ ret i8 %subx
+}
+
+define i8 @smin_not_sub_intrinsic_commute2(i8 %x, i8 %y) {
+; CHECK-LABEL: @smin_not_sub_intrinsic_commute2(
+; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
+; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
+; CHECK-NEXT: call void @use8(i8 [[NY]])
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[NX]], i8 [[NY]])
+; CHECK-NEXT: call void @use8(i8 [[M]])
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[M]], [[NX]]
+; CHECK-NEXT: ret i8 [[SUBX]]
+;
+ %nx = xor i8 %x, -1
+ %ny = xor i8 %y, -1
+ call void @use8(i8 %ny)
+ %m = call i8 @llvm.smin.i8(i8 %nx, i8 %ny)
+ call void @use8(i8 %m)
+ %subx = sub i8 %m, %nx
+ ret i8 %subx
+}
+
+define i8 @smax_not_sub_intrinsic_commute3(i8 %x, i8 %y) {
+; CHECK-LABEL: @smax_not_sub_intrinsic_commute3(
+; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
+; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
+; CHECK-NEXT: call void @use8(i8 [[NY]])
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[NY]], i8 [[NX]])
+; CHECK-NEXT: call void @use8(i8 [[M]])
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[M]], [[NX]]
+; CHECK-NEXT: ret i8 [[SUBX]]
+;
+ %nx = xor i8 %x, -1
+ %ny = xor i8 %y, -1
+ call void @use8(i8 %ny)
+ %m = call i8 @llvm.smax.i8(i8 %ny, i8 %nx)
+ call void @use8(i8 %m)
+ %subx = sub i8 %m, %nx
+ ret i8 %subx
+}
+
+define i8 @umin_not_sub_intrinsic_uses(i8 %x, i8 %y) {
+; CHECK-LABEL: @umin_not_sub_intrinsic_uses(
+; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
+; CHECK-NEXT: call void @use8(i8 [[NX]])
+; CHECK-NEXT: [[NY:%.*]] = xor i8 [[Y:%.*]], -1
+; CHECK-NEXT: call void @use8(i8 [[NY]])
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[NX]], i8 [[NY]])
+; CHECK-NEXT: call void @use8(i8 [[M]])
+; CHECK-NEXT: [[SUBX:%.*]] = sub i8 [[NX]], [[M]]
+; CHECK-NEXT: ret i8 [[SUBX]]
+;
+ %nx = xor i8 %x, -1
+ call void @use8(i8 %nx)
+ %ny = xor i8 %y, -1
+ call void @use8(i8 %ny)
+ %m = call i8 @llvm.umin.i8(i8 %nx, i8 %ny)
+ call void @use8(i8 %m)
+ %subx = sub i8 %nx, %m
+ ret i8 %subx
+}
+
declare void @use8(i8)
declare void @use32(i32 %u)
More information about the llvm-commits
mailing list