[InstSimplify] add tests for select with min/max op; NFC
authorSanjay Patel <spatel@rotateright.com>
Fri, 23 Sep 2022 18:31:51 +0000 (14:31 -0400)
committerSanjay Patel <spatel@rotateright.com>
Sat, 24 Sep 2022 15:13:17 +0000 (11:13 -0400)
These are organized as 10 (predicates) * 4 (swapped operands) * 4 (min/max variants) = 160 tests.

llvm/test/Transforms/InstSimplify/select-maxmin.ll [new file with mode: 0644]

diff --git a/llvm/test/Transforms/InstSimplify/select-maxmin.ll b/llvm/test/Transforms/InstSimplify/select-maxmin.ll
new file mode 100644 (file)
index 0000000..2b38ecf
--- /dev/null
@@ -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
+}