From eb454433f49ce27144e3db2f5b6f0b013b050a30 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Fri, 23 Sep 2022 14:31:51 -0400 Subject: [PATCH] [InstSimplify] add tests for select with min/max op; NFC These are organized as 10 (predicates) * 4 (swapped operands) * 4 (min/max variants) = 160 tests. --- llvm/test/Transforms/InstSimplify/select-maxmin.ll | 2119 ++++++++++++++++++++ 1 file changed, 2119 insertions(+) create mode 100644 llvm/test/Transforms/InstSimplify/select-maxmin.ll diff --git a/llvm/test/Transforms/InstSimplify/select-maxmin.ll b/llvm/test/Transforms/InstSimplify/select-maxmin.ll new file mode 100644 index 0000000..2b38ecf --- /dev/null +++ b/llvm/test/Transforms/InstSimplify/select-maxmin.ll @@ -0,0 +1,2119 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -passes=instsimplify -S | FileCheck %s + +declare i8 @llvm.smin.i8(i8, i8) +declare i8 @llvm.smax.i8(i8, i8) +declare i8 @llvm.umin.i8(i8, i8) +declare i8 @llvm.umax.i8(i8, i8) + +; smin + +define i8 @slt_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_xy_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap icmp operands + +define i8 @slt_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_yx_smin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_smin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap select operands + +define i8 @slt_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_xy_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +; swap icmp and select operands + +define i8 @slt_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_yx_smin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_smin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.smin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +; smax + +define i8 @slt_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_xy_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap icmp operands + +define i8 @slt_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_yx_smax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_smax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap select operands + +define i8 @slt_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_xy_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +; swap icmp and select operands + +define i8 @slt_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_yx_smax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_smax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.smax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +; umin + +define i8 @slt_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_xy_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap icmp operands + +define i8 @slt_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_yx_umin_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_umin_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap select operands + +define i8 @slt_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_xy_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +; swap icmp and select operands + +define i8 @slt_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_yx_umin_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_umin_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.umin.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +; umax + +define i8 @slt_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_xy_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap icmp operands + +define i8 @slt_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sle_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sgt_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @sge_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ult_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ule_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ugt_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @uge_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @eq_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +define i8 @ne_yx_umax_fval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_umax_fval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %x, i8 %m + ret i8 %r +} + +; swap select operands + +define i8 @slt_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_xy_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_xy_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %x, %y + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +; swap icmp and select operands + +define i8 @slt_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @slt_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp slt i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sle_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sle_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sle i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sgt_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sgt_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sgt i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @sge_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @sge_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp sge i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ult_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ult_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ult i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ule_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ule_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ule i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ugt_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ugt_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ugt i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @uge_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @uge_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp uge i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @eq_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @eq_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp eq i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %x, i8 %y) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} + +define i8 @ne_yx_umax_tval(i8 %x, i8 %y) { +; CHECK-LABEL: @ne_yx_umax_tval( +; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]]) +; CHECK-NEXT: [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]] +; CHECK-NEXT: ret i8 [[R]] +; + %i = icmp ne i8 %y, %x + %m = call i8 @llvm.umax.i8(i8 %y, i8 %x) + %r = select i1 %i, i8 %m, i8 %x + ret i8 %r +} -- 2.7.4