Nikita Popov 9d92f479c3 Reapply [InstSimplify] Support all instructions in simplifyWithOpReplaced()
Relative to the previous attempt, this includes a bailout for phi
nodes, whose arguments might refer to a previous cycle iteration.

We did not hit this before by a fortunate deficiency of the
ConstantFoldInstOperands() API, which doesn't handle phi nodes,
unlike ConstantFoldInstruction().

-----

Instead of hardcoding a few instruction kinds, use the generic
interface now that we have it.

The primary effect of this is that intrinsics are now supported.

It's worth noting that this is still limited in that it does not
support vectors, so we can't remove e.g. existing fshl special
cases.
2023-04-25 15:45:32 +02:00

2146 lines
63 KiB
LLVM

; 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)
declare <4 x i8> @llvm.smin.v4i8(<4 x i8>, <4 x i8>)
declare <4 x i8> @llvm.smax.v4i8(<4 x i8>, <4 x i8>)
declare <4 x i8> @llvm.umin.v4i8(<4 x i8>, <4 x i8>)
declare <4 x i8> @llvm.umax.v4i8(<4 x i8>, <4 x i8>)
; smin
define i8 @slt_xy_smin_fval(i8 %x, i8 %y) {
; CHECK-LABEL: @slt_xy_smin_fval(
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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: ret i8 [[X:%.*]]
;
%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: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
; CHECK-NEXT: ret i8 [[M]]
;
%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
}
; negative test - wrong cmp op
define i8 @ne_yz_umax_tval(i8 %x, i8 %y, i8 %z) {
; CHECK-LABEL: @ne_yz_umax_tval(
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[Z:%.*]]
; 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, %z
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
%r = select i1 %i, i8 %m, i8 %x
ret i8 %r
}
; negative test - wrong max op
define i8 @ne_yx_umax_tval_wrong_op(i8 %x, i8 %y, i8 %z) {
; CHECK-LABEL: @ne_yx_umax_tval_wrong_op(
; CHECK-NEXT: [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]]
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Z:%.*]], 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 %z, i8 %x)
%r = select i1 %i, i8 %m, i8 %x
ret i8 %r
}
; negative test - wrong cmp op
define i8 @eq_yz_umax_tval(i8 %x, i8 %y, i8 %z) {
; CHECK-LABEL: @eq_yz_umax_tval(
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[Z:%.*]]
; 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 eq i8 %y, %z
%m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
%r = select i1 %i, i8 %m, i8 %x
ret i8 %r
}
; negative test - wrong max op
define i8 @eq_yx_umax_tval_wrong_op(i8 %x, i8 %y, i8 %z) {
; CHECK-LABEL: @eq_yx_umax_tval_wrong_op(
; CHECK-NEXT: [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]
; CHECK-NEXT: [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Z:%.*]], i8 [[X]])
; 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 %z, i8 %x)
%r = select i1 %i, i8 %m, i8 %x
ret i8 %r
}
; select with smin pred
define <4 x i8> @slt_xy_smin_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @slt_xy_smin_select_y_shuf_fval(
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.smin.v4i8(<4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]])
; CHECK-NEXT: ret <4 x i8> [[M]]
;
%i = icmp slt <4 x i8> %x, %y
%m = call <4 x i8> @llvm.smin.v4i8(<4 x i8> %x, <4 x i8> %y)
%s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; negative test - wrong pred
define <4 x i8> @sgt_xy_smin_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @sgt_xy_smin_select_y_shuf_fval(
; CHECK-NEXT: [[I:%.*]] = icmp sgt <4 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.smin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp sgt <4 x i8> %x, %y
%m = call <4 x i8> @llvm.smin.v4i8(<4 x i8> %x, <4 x i8> %y)
%s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; negative test - wrong shuffle op
define <4 x i8> @slt_xy_smin_select_x_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @slt_xy_smin_select_x_shuf_fval(
; CHECK-NEXT: [[I:%.*]] = icmp slt <4 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.smin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[M]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp slt <4 x i8> %x, %y
%m = call <4 x i8> @llvm.smin.v4i8(<4 x i8> %x, <4 x i8> %y)
%s = shufflevector <4 x i8> %x, <4 x i8> %m, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; select with non-strict smax pred
define <4 x i8> @sge_xy_smax_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @sge_xy_smax_select_y_shuf_fval(
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.smax.v4i8(<4 x i8> [[Y:%.*]], <4 x i8> [[X:%.*]])
; CHECK-NEXT: ret <4 x i8> [[M]]
;
%i = icmp sge <4 x i8> %x, %y
%m = call <4 x i8> @llvm.smax.v4i8(<4 x i8> %y, <4 x i8> %x)
%s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; negative test - wrong (swapped) pred
define <4 x i8> @sle_yx_smax_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @sle_yx_smax_select_y_shuf_fval(
; CHECK-NEXT: [[I:%.*]] = icmp sge <4 x i8> [[Y:%.*]], [[X:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.smax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 4, i32 1, i32 6, i32 3>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp sge <4 x i8> %y, %x
%m = call <4 x i8> @llvm.smax.v4i8(<4 x i8> %y, <4 x i8> %x)
%s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; negative test - wrong shuffle op
define <4 x i8> @sge_xy_smax_select_x_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @sge_xy_smax_select_x_shuf_fval(
; CHECK-NEXT: [[I:%.*]] = icmp sge <4 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.smax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[M]], <4 x i32> <i32 4, i32 1, i32 6, i32 3>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp sge <4 x i8> %x, %y
%m = call <4 x i8> @llvm.smax.v4i8(<4 x i8> %y, <4 x i8> %x)
%s = shufflevector <4 x i8> %x, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; select with non-strict inverted umin pred
define <4 x i8> @uge_xy_umin_select_y_shuf_tval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @uge_xy_umin_select_y_shuf_tval(
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.umin.v4i8(<4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]])
; CHECK-NEXT: ret <4 x i8> [[M]]
;
%i = icmp uge <4 x i8> %x, %y
%m = call <4 x i8> @llvm.umin.v4i8(<4 x i8> %x, <4 x i8> %y)
%s = shufflevector <4 x i8> %m, <4 x i8> %y, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
%r = select <4 x i1> %i, <4 x i8> %s, <4 x i8> %x
ret <4 x i8> %r
}
; negative test - wrong pred
define <4 x i8> @uge_xy_umin_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @uge_xy_umin_select_y_shuf_fval(
; CHECK-NEXT: [[I:%.*]] = icmp uge <4 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.umin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[M]], <4 x i8> [[Y]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp uge <4 x i8> %x, %y
%m = call <4 x i8> @llvm.umin.v4i8(<4 x i8> %x, <4 x i8> %y)
%s = shufflevector <4 x i8> %m, <4 x i8> %y, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; negative test - wrong shuffle op
define <4 x i8> @uge_xy_umin_select_x_shuf_tval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @uge_xy_umin_select_x_shuf_tval(
; CHECK-NEXT: [[I:%.*]] = icmp uge <4 x i8> [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.umin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[M]], <4 x i8> [[X]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[S]], <4 x i8> [[X]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp uge <4 x i8> %x, %y
%m = call <4 x i8> @llvm.umin.v4i8(<4 x i8> %x, <4 x i8> %y)
%s = shufflevector <4 x i8> %m, <4 x i8> %x, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
%r = select <4 x i1> %i, <4 x i8> %s, <4 x i8> %x
ret <4 x i8> %r
}
; select with swapped umax pred
define <4 x i8> @ult_yx_umax_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @ult_yx_umax_select_y_shuf_fval(
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.umax.v4i8(<4 x i8> [[Y:%.*]], <4 x i8> [[X:%.*]])
; CHECK-NEXT: ret <4 x i8> [[M]]
;
%i = icmp ult <4 x i8> %y, %x
%m = call <4 x i8> @llvm.umax.v4i8(<4 x i8> %y, <4 x i8> %x)
%s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
; negative test - wrong (inverted+swapped) pred
define <4 x i8> @ult_yx_umax_select_y_shuf_tval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @ult_yx_umax_select_y_shuf_tval(
; CHECK-NEXT: [[I:%.*]] = icmp ult <4 x i8> [[Y:%.*]], [[X:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.umax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[S]], <4 x i8> [[X]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp ult <4 x i8> %y, %x
%m = call <4 x i8> @llvm.umax.v4i8(<4 x i8> %y, <4 x i8> %x)
%s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
%r = select <4 x i1> %i, <4 x i8> %s, <4 x i8> %x
ret <4 x i8> %r
}
; negative test - wrong shuffle mask
define <4 x i8> @ult_yx_umax_select_y_shuf_mask_fval(<4 x i8> %x, <4 x i8> %y) {
; CHECK-LABEL: @ult_yx_umax_select_y_shuf_mask_fval(
; CHECK-NEXT: [[I:%.*]] = icmp ult <4 x i8> [[Y:%.*]], [[X:%.*]]
; CHECK-NEXT: [[M:%.*]] = call <4 x i8> @llvm.umax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
; CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 5, i32 1, i32 2, i32 3>
; CHECK-NEXT: [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
; CHECK-NEXT: ret <4 x i8> [[R]]
;
%i = icmp ult <4 x i8> %y, %x
%m = call <4 x i8> @llvm.umax.v4i8(<4 x i8> %y, <4 x i8> %x)
%s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 5, i32 1, i32 2, i32 3>
%r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
ret <4 x i8> %r
}
define i8 @select_umin_with_icmp_zero(i8 %x, i8 %y) {
; CHECK-LABEL: @select_umin_with_icmp_zero(
; CHECK-NEXT: ret i8 0
;
%min = call i8 @llvm.umin.i8(i8 %x, i8 %y)
%cmp = icmp eq i8 %x, 0
%sel = select i1 %cmp, i8 %min, i8 0
ret i8 %sel
}