[llvm] 960cef7 - [InstSimplify] add tests for compare of min/max; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 4 10:55:37 PDT 2020
Author: Sanjay Patel
Date: 2020-08-04T13:55:30-04:00
New Revision: 960cef75f4d289e01b338c2f98c5dca2520ee8ff
URL: https://github.com/llvm/llvm-project/commit/960cef75f4d289e01b338c2f98c5dca2520ee8ff
DIFF: https://github.com/llvm/llvm-project/commit/960cef75f4d289e01b338c2f98c5dca2520ee8ff.diff
LOG: [InstSimplify] add tests for compare of min/max; NFC
The test are adapted from the existing tests for cmp/select idioms.
Added:
Modified:
llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll b/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
index 6b10853dd78f..1053bfa431ed 100644
--- a/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
+++ b/llvm/test/Transforms/InstSimplify/maxmin_intrinsics.ll
@@ -809,3 +809,327 @@ define <2 x i8> @smax_smax_constants_partial_undef(<2 x i8> %x) {
%m2 = call <2 x i8> @llvm.smax.v2i8(<2 x i8> <i8 9, i8 9>, <2 x i8> %m)
ret <2 x i8> %m2
}
+
+define i1 @smax_slt(i8 %x, i8 %y) {
+; CHECK-LABEL: @smax_slt(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %r = icmp slt i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @smax_sge(i8 %x, i8 %y) {
+; CHECK-LABEL: @smax_sge(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %r = icmp sge i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @umax_ult(i8 %x, i8 %y) {
+; CHECK-LABEL: @umax_ult(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %r = icmp ult i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @umax_uge(i8 %x, i8 %y) {
+; CHECK-LABEL: @umax_uge(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %r = icmp uge i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @smax_sgt(i8 %x, i8 %y) {
+; CHECK-LABEL: @smax_sgt(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %r = icmp sgt i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @smax_sle(i8 %x, i8 %y) {
+; CHECK-LABEL: @smax_sle(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %r = icmp sle i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @umax_ugt(i8 %x, i8 %y) {
+; CHECK-LABEL: @umax_ugt(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %r = icmp ugt i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @umax_ule(i8 %x, i8 %y) {
+; CHECK-LABEL: @umax_ule(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %r = icmp ule i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @smin_sgt(i8 %x, i8 %y) {
+; CHECK-LABEL: @smin_sgt(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
+ %r = icmp sgt i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @smin_sle(i8 %x, i8 %y) {
+; CHECK-LABEL: @smin_sle(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
+ %r = icmp sle i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @umin_ugt(i8 %x, i8 %y) {
+; CHECK-LABEL: @umin_ugt(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
+ %r = icmp ugt i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @umin_ule(i8 %x, i8 %y) {
+; CHECK-LABEL: @umin_ule(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[M]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
+ %r = icmp ule i8 %m, %x
+ ret i1 %r
+}
+
+define i1 @smin_slt(i8 %x, i8 %y) {
+; CHECK-LABEL: @smin_slt(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
+ %r = icmp slt i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @smin_sge(i8 %x, i8 %y) {
+; CHECK-LABEL: @smin_sge(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
+ %r = icmp sge i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @umin_ult(i8 %x, i8 %y) {
+; CHECK-LABEL: @umin_ult(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
+ %r = icmp ult i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @umin_uge(i8 %x, i8 %y) {
+; CHECK-LABEL: @umin_uge(
+; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[X]], [[M]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
+ %r = icmp uge i8 %x, %m
+ ret i1 %r
+}
+
+define i1 @smaxmin_sge(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @smaxmin_sge(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp sge i8 [[MAX]], [[MIN]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.smin.i8(i8 %z, i8 %x)
+ %c = icmp sge i8 %max, %min
+ ret i1 %c
+}
+
+define i1 @smaxmin_sgt(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @smaxmin_sgt(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp sgt i8 [[MIN]], [[MAX]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.smin.i8(i8 %z, i8 %x)
+ %c = icmp sgt i8 %min, %max
+ ret i1 %c
+}
+
+define i1 @smaxmin_sle(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @smaxmin_sle(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp sle i8 [[MIN]], [[MAX]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.smin.i8(i8 %z, i8 %x)
+ %c = icmp sle i8 %min, %max
+ ret i1 %c
+}
+
+define i1 @smaxmin_slt(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @smaxmin_slt(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.smin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[MAX]], [[MIN]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.smin.i8(i8 %z, i8 %x)
+ %c = icmp slt i8 %max, %min
+ ret i1 %c
+}
+
+define i1 @umaxmin_uge(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @umaxmin_uge(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp uge i8 [[MAX]], [[MIN]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.umin.i8(i8 %z, i8 %x)
+ %c = icmp uge i8 %max, %min
+ ret i1 %c
+}
+
+define i1 @umaxmin_ugt(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @umaxmin_ugt(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp ugt i8 [[MIN]], [[MAX]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.umin.i8(i8 %z, i8 %x)
+ %c = icmp ugt i8 %min, %max
+ ret i1 %c
+}
+
+define i1 @umaxmin_ule(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @umaxmin_ule(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp ule i8 [[MIN]], [[MAX]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.umin.i8(i8 %z, i8 %x)
+ %c = icmp ule i8 %min, %max
+ ret i1 %c
+}
+
+define i1 @umaxmin_ult(i8 %x, i8 %y, i8 %z) {
+; CHECK-LABEL: @umaxmin_ult(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[Z:%.*]], i8 [[X]])
+; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[MAX]], [[MIN]]
+; CHECK-NEXT: ret i1 [[C]]
+;
+ %max = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %min = call i8 @llvm.umin.i8(i8 %z, i8 %x)
+ %c = icmp ult i8 %max, %min
+ ret i1 %c
+}
+
+define i1 @smax_eq(i8 %x, i8 %y) {
+; CHECK-LABEL: @smax_eq(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[MAX]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %max = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %r = icmp eq i8 %max, %x
+ ret i1 %r
+}
+
+define i1 @smax_eq_commute(i8 %x, i8 %y) {
+; CHECK-LABEL: @smax_eq_commute(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X]], [[MAX]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %max = call i8 @llvm.smax.i8(i8 %x, i8 %y)
+ %r = icmp eq i8 %x, %max
+ ret i1 %r
+}
+
+define i1 @umax_eq(i8 %x, i8 %y) {
+; CHECK-LABEL: @umax_eq(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[MAX]], [[X]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %max = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %r = icmp eq i8 %max, %x
+ ret i1 %r
+}
+
+define i1 @umax_eq_commute(i8 %x, i8 %y) {
+; CHECK-LABEL: @umax_eq_commute(
+; CHECK-NEXT: [[MAX:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
+; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[X]], [[MAX]]
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %max = call i8 @llvm.umax.i8(i8 %x, i8 %y)
+ %r = icmp eq i8 %x, %max
+ ret i1 %r
+}
More information about the llvm-commits
mailing list