[llvm] eb45443 - [InstSimplify] add tests for select with min/max op; NFC

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 24 08:34:54 PDT 2022


Author: Sanjay Patel
Date: 2022-09-24T11:13:17-04:00
New Revision: eb454433f49ce27144e3db2f5b6f0b013b050a30

URL: https://github.com/llvm/llvm-project/commit/eb454433f49ce27144e3db2f5b6f0b013b050a30
DIFF: https://github.com/llvm/llvm-project/commit/eb454433f49ce27144e3db2f5b6f0b013b050a30.diff

LOG: [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.

Added: 
    llvm/test/Transforms/InstSimplify/select-maxmin.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstSimplify/select-maxmin.ll b/llvm/test/Transforms/InstSimplify/select-maxmin.ll
new file mode 100644
index 0000000000000..2b38ecfcce273
--- /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
+}


        


More information about the llvm-commits mailing list