From 011e15bea3456cf429a801e309c65bef14fa22ad Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Mon, 3 Aug 2020 16:51:05 -0400 Subject: [PATCH] [InstSimplify] add tests for min/max with constants; NFC --- .../InstSimplify/maxmin_intrinsics.ll | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) diff --git a/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll b/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll index 7a31a4dcb9a3..3aa19e91e0e3 100644 --- a/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll +++ b/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll @@ -572,6 +572,8 @@ define i8 @smin_smax_commute3(i8 %x, i8 %y) { ret i8 %m2 } +; Negative test - mismatched intrinsics. + define i8 @smax_umin(i8 %x, i8 %y) { ; CHECK-LABEL: @smax_umin( ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) @@ -583,6 +585,8 @@ define i8 @smax_umin(i8 %x, i8 %y) { ret i8 %m2 } +; Negative test - mismatched intrinsics. + define i8 @smax_umax(i8 %x, i8 %y) { ; CHECK-LABEL: @smax_umax( ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) @@ -594,6 +598,8 @@ define i8 @smax_umax(i8 %x, i8 %y) { ret i8 %m2 } +; Negative test - mismatched intrinsics. + define i8 @umax_smin(i8 %x, i8 %y) { ; CHECK-LABEL: @umax_smin( ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) @@ -605,6 +611,8 @@ define i8 @umax_smin(i8 %x, i8 %y) { ret i8 %m2 } +; Negative test - mismatched intrinsics. + define i8 @umin_smin(i8 %x, i8 %y) { ; CHECK-LABEL: @umin_smin( ; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]]) @@ -615,3 +623,201 @@ define i8 @umin_smin(i8 %x, i8 %y) { %m2 = call i8 @llvm.smin.i8(i8 %m, i8 %x) ret i8 %m2 } + +define i8 @umax_umax_constants(i8 %x) { +; CHECK-LABEL: @umax_umax_constants( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 9) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.umax.i8(i8 7, i8 [[M]]) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.umax.i8(i8 %x, i8 9) + %m2 = call i8 @llvm.umax.i8(i8 7, i8 %m) + ret i8 %m2 +} + +define i8 @umax_umax_constants_commute1(i8 %x) { +; CHECK-LABEL: @umax_umax_constants_commute1( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 -128, i8 [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.umax.i8(i8 7, i8 [[M]]) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.umax.i8(i8 128, i8 %x) + %m2 = call i8 @llvm.umax.i8(i8 7, i8 %m) + ret i8 %m2 +} + +define i8 @umax_umax_constants_commute2(i8 %x) { +; CHECK-LABEL: @umax_umax_constants_commute2( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 -56) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.umax.i8(i8 [[M]], i8 127) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.umax.i8(i8 %x, i8 200) + %m2 = call i8 @llvm.umax.i8(i8 %m, i8 127) + ret i8 %m2 +} + +define <2 x i8> @umax_umax_constants_commute3(<2 x i8> %x) { +; CHECK-LABEL: @umax_umax_constants_commute3( +; CHECK-NEXT: [[M:%.*]] = call <2 x i8> @llvm.umax.v2i8(<2 x i8> , <2 x i8> [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call <2 x i8> @llvm.umax.v2i8(<2 x i8> [[M]], <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[M2]] +; + %m = call <2 x i8> @llvm.umax.v2i8(<2 x i8> , <2 x i8> %x) + %m2 = call <2 x i8> @llvm.umax.v2i8(<2 x i8> %m, <2 x i8> ) + ret <2 x i8> %m2 +} + +define i8 @umin_umin_constants(i8 %x) { +; CHECK-LABEL: @umin_umin_constants( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 7) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.umin.i8(i8 9, i8 [[M]]) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.umin.i8(i8 %x, i8 7) + %m2 = call i8 @llvm.umin.i8(i8 9, i8 %m) + ret i8 %m2 +} + +define i8 @umin_umin_constants_commute1(i8 %x) { +; CHECK-LABEL: @umin_umin_constants_commute1( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 7, i8 [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.umin.i8(i8 -128, i8 [[M]]) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.umin.i8(i8 7, i8 %x) + %m2 = call i8 @llvm.umin.i8(i8 128, i8 %m) + ret i8 %m2 +} + +define <2 x i8> @umin_umin_constants_commute2(<2 x i8> %x) { +; CHECK-LABEL: @umin_umin_constants_commute2( +; CHECK-NEXT: [[M:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[X:%.*]], <2 x i8> ) +; CHECK-NEXT: [[M2:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[M]], <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[M2]] +; + %m = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %x, <2 x i8> ) + %m2 = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %m, <2 x i8> ) + ret <2 x i8> %m2 +} + +define i8 @umin_umin_constants_commute3(i8 %x) { +; CHECK-LABEL: @umin_umin_constants_commute3( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 -128, i8 [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.umin.i8(i8 [[M]], i8 -2) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.umin.i8(i8 128, i8 %x) + %m2 = call i8 @llvm.umin.i8(i8 %m, i8 254) + ret i8 %m2 +} + +define i8 @smax_smax_constants(i8 %x) { +; CHECK-LABEL: @smax_smax_constants( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 9) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.smax.i8(i8 7, i8 [[M]]) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.smax.i8(i8 %x, i8 9) + %m2 = call i8 @llvm.smax.i8(i8 7, i8 %m) + ret i8 %m2 +} + +define <2 x i8> @smax_smax_constants_commute1(<2 x i8> %x) { +; CHECK-LABEL: @smax_smax_constants_commute1( +; CHECK-NEXT: [[M:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> , <2 x i8> [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> , <2 x i8> [[M]]) +; CHECK-NEXT: ret <2 x i8> [[M2]] +; + %m = call <2 x i8> @llvm.smax.v2i8(<2 x i8> , <2 x i8> %x) + %m2 = call <2 x i8> @llvm.smax.v2i8(<2 x i8> , <2 x i8> %m) + ret <2 x i8> %m2 +} + +define i8 @smax_smax_constants_commute2(i8 %x) { +; CHECK-LABEL: @smax_smax_constants_commute2( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 0) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.smax.i8(i8 [[M]], i8 -1) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.smax.i8(i8 %x, i8 0) + %m2 = call i8 @llvm.smax.i8(i8 %m, i8 -1) + ret i8 %m2 +} + +define i8 @smax_smax_constants_commute3(i8 %x) { +; CHECK-LABEL: @smax_smax_constants_commute3( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 -1, i8 [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.smax.i8(i8 [[M]], i8 -127) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.smax.i8(i8 -1, i8 %x) + %m2 = call i8 @llvm.smax.i8(i8 %m, i8 -127) + ret i8 %m2 +} + +define <2 x i8> @smin_smin_constants(<2 x i8> %x) { +; CHECK-LABEL: @smin_smin_constants( +; CHECK-NEXT: [[M:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[X:%.*]], <2 x i8> ) +; CHECK-NEXT: [[M2:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> , <2 x i8> [[M]]) +; CHECK-NEXT: ret <2 x i8> [[M2]] +; + %m = call <2 x i8> @llvm.smin.v2i8(<2 x i8> %x, <2 x i8> ) + %m2 = call <2 x i8> @llvm.smin.v2i8(<2 x i8> , <2 x i8> %m) + ret <2 x i8> %m2 +} + +define i8 @smin_smin_constants_commute1(i8 %x) { +; CHECK-LABEL: @smin_smin_constants_commute1( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 -127, i8 [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.smin.i8(i8 7, i8 [[M]]) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.smin.i8(i8 -127, i8 %x) + %m2 = call i8 @llvm.smin.i8(i8 7, i8 %m) + ret i8 %m2 +} + +define i8 @smin_smin_constants_commute2(i8 %x) { +; CHECK-LABEL: @smin_smin_constants_commute2( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 -1) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 0) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.smin.i8(i8 %x, i8 -1) + %m2 = call i8 @llvm.smin.i8(i8 %m, i8 0) + ret i8 %m2 +} + +define i8 @smin_smin_constants_commute3(i8 %x) { +; CHECK-LABEL: @smin_smin_constants_commute3( +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 -127, i8 [[X:%.*]]) +; CHECK-NEXT: [[M2:%.*]] = call i8 @llvm.smin.i8(i8 [[M]], i8 -1) +; CHECK-NEXT: ret i8 [[M2]] +; + %m = call i8 @llvm.smin.i8(i8 -127, i8 %x) + %m2 = call i8 @llvm.smin.i8(i8 %m, i8 -1) + ret i8 %m2 +} + +define <2 x i8> @umin_umin_constants_partial_undef(<2 x i8> %x) { +; CHECK-LABEL: @umin_umin_constants_partial_undef( +; CHECK-NEXT: [[M:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> [[X:%.*]], <2 x i8> ) +; CHECK-NEXT: [[M2:%.*]] = call <2 x i8> @llvm.umin.v2i8(<2 x i8> , <2 x i8> [[M]]) +; CHECK-NEXT: ret <2 x i8> [[M2]] +; + %m = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %x, <2 x i8> ) + %m2 = call <2 x i8> @llvm.umin.v2i8(<2 x i8> , <2 x i8> %m) + ret <2 x i8> %m2 +} + +define <2 x i8> @smax_smax_constants_partial_undef(<2 x i8> %x) { +; CHECK-LABEL: @smax_smax_constants_partial_undef( +; CHECK-NEXT: [[M:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> [[X:%.*]], <2 x i8> ) +; CHECK-NEXT: [[M2:%.*]] = call <2 x i8> @llvm.smax.v2i8(<2 x i8> , <2 x i8> [[M]]) +; CHECK-NEXT: ret <2 x i8> [[M2]] +; + %m = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %x, <2 x i8> ) + %m2 = call <2 x i8> @llvm.smax.v2i8(<2 x i8> , <2 x i8> %m) + ret <2 x i8> %m2 +}