[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