xref: /llvm-project/llvm/test/Transforms/InstSimplify/select-maxmin.ll (revision 9d92f479c3fb708ea0cad8aa6fa70fd46f753123)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4declare i8 @llvm.smin.i8(i8, i8)
5declare i8 @llvm.smax.i8(i8, i8)
6declare i8 @llvm.umin.i8(i8, i8)
7declare i8 @llvm.umax.i8(i8, i8)
8declare <4 x i8> @llvm.smin.v4i8(<4 x i8>, <4 x i8>)
9declare <4 x i8> @llvm.smax.v4i8(<4 x i8>, <4 x i8>)
10declare <4 x i8> @llvm.umin.v4i8(<4 x i8>, <4 x i8>)
11declare <4 x i8> @llvm.umax.v4i8(<4 x i8>, <4 x i8>)
12
13; smin
14
15define i8 @slt_xy_smin_fval(i8 %x, i8 %y) {
16; CHECK-LABEL: @slt_xy_smin_fval(
17; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
18; CHECK-NEXT:    ret i8 [[M]]
19;
20  %i = icmp slt i8 %x, %y
21  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
22  %r = select i1 %i, i8 %x, i8 %m
23  ret i8 %r
24}
25
26define i8 @sle_xy_smin_fval(i8 %x, i8 %y) {
27; CHECK-LABEL: @sle_xy_smin_fval(
28; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
29; CHECK-NEXT:    ret i8 [[M]]
30;
31  %i = icmp sle i8 %x, %y
32  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
33  %r = select i1 %i, i8 %x, i8 %m
34  ret i8 %r
35}
36
37define i8 @sgt_xy_smin_fval(i8 %x, i8 %y) {
38; CHECK-LABEL: @sgt_xy_smin_fval(
39; CHECK-NEXT:    ret i8 [[X:%.*]]
40;
41  %i = icmp sgt i8 %x, %y
42  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
43  %r = select i1 %i, i8 %x, i8 %m
44  ret i8 %r
45}
46
47define i8 @sge_xy_smin_fval(i8 %x, i8 %y) {
48; CHECK-LABEL: @sge_xy_smin_fval(
49; CHECK-NEXT:    ret i8 [[X:%.*]]
50;
51  %i = icmp sge i8 %x, %y
52  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
53  %r = select i1 %i, i8 %x, i8 %m
54  ret i8 %r
55}
56
57define i8 @ult_xy_smin_fval(i8 %x, i8 %y) {
58; CHECK-LABEL: @ult_xy_smin_fval(
59; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
60; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
61; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
62; CHECK-NEXT:    ret i8 [[R]]
63;
64  %i = icmp ult i8 %x, %y
65  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
66  %r = select i1 %i, i8 %x, i8 %m
67  ret i8 %r
68}
69
70define i8 @ule_xy_smin_fval(i8 %x, i8 %y) {
71; CHECK-LABEL: @ule_xy_smin_fval(
72; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
73; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
74; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
75; CHECK-NEXT:    ret i8 [[R]]
76;
77  %i = icmp ule i8 %x, %y
78  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
79  %r = select i1 %i, i8 %x, i8 %m
80  ret i8 %r
81}
82
83define i8 @ugt_xy_smin_fval(i8 %x, i8 %y) {
84; CHECK-LABEL: @ugt_xy_smin_fval(
85; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
86; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
87; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
88; CHECK-NEXT:    ret i8 [[R]]
89;
90  %i = icmp ugt i8 %x, %y
91  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
92  %r = select i1 %i, i8 %x, i8 %m
93  ret i8 %r
94}
95
96define i8 @uge_xy_smin_fval(i8 %x, i8 %y) {
97; CHECK-LABEL: @uge_xy_smin_fval(
98; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
99; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
100; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
101; CHECK-NEXT:    ret i8 [[R]]
102;
103  %i = icmp uge i8 %x, %y
104  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
105  %r = select i1 %i, i8 %x, i8 %m
106  ret i8 %r
107}
108
109define i8 @eq_xy_smin_fval(i8 %x, i8 %y) {
110; CHECK-LABEL: @eq_xy_smin_fval(
111; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
112; CHECK-NEXT:    ret i8 [[M]]
113;
114  %i = icmp eq i8 %x, %y
115  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
116  %r = select i1 %i, i8 %x, i8 %m
117  ret i8 %r
118}
119
120define i8 @ne_xy_smin_fval(i8 %x, i8 %y) {
121; CHECK-LABEL: @ne_xy_smin_fval(
122; CHECK-NEXT:    ret i8 [[X:%.*]]
123;
124  %i = icmp ne i8 %x, %y
125  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
126  %r = select i1 %i, i8 %x, i8 %m
127  ret i8 %r
128}
129
130; swap icmp operands
131
132define i8 @slt_yx_smin_fval(i8 %x, i8 %y) {
133; CHECK-LABEL: @slt_yx_smin_fval(
134; CHECK-NEXT:    ret i8 [[X:%.*]]
135;
136  %i = icmp slt i8 %y, %x
137  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
138  %r = select i1 %i, i8 %x, i8 %m
139  ret i8 %r
140}
141
142define i8 @sle_yx_smin_fval(i8 %x, i8 %y) {
143; CHECK-LABEL: @sle_yx_smin_fval(
144; CHECK-NEXT:    ret i8 [[X:%.*]]
145;
146  %i = icmp sle i8 %y, %x
147  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
148  %r = select i1 %i, i8 %x, i8 %m
149  ret i8 %r
150}
151
152define i8 @sgt_yx_smin_fval(i8 %x, i8 %y) {
153; CHECK-LABEL: @sgt_yx_smin_fval(
154; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
155; CHECK-NEXT:    ret i8 [[M]]
156;
157  %i = icmp sgt i8 %y, %x
158  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
159  %r = select i1 %i, i8 %x, i8 %m
160  ret i8 %r
161}
162
163define i8 @sge_yx_smin_fval(i8 %x, i8 %y) {
164; CHECK-LABEL: @sge_yx_smin_fval(
165; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
166; CHECK-NEXT:    ret i8 [[M]]
167;
168  %i = icmp sge i8 %y, %x
169  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
170  %r = select i1 %i, i8 %x, i8 %m
171  ret i8 %r
172}
173
174define i8 @ult_yx_smin_fval(i8 %x, i8 %y) {
175; CHECK-LABEL: @ult_yx_smin_fval(
176; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
177; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
178; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
179; CHECK-NEXT:    ret i8 [[R]]
180;
181  %i = icmp ult i8 %y, %x
182  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
183  %r = select i1 %i, i8 %x, i8 %m
184  ret i8 %r
185}
186
187define i8 @ule_yx_smin_fval(i8 %x, i8 %y) {
188; CHECK-LABEL: @ule_yx_smin_fval(
189; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
190; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
191; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
192; CHECK-NEXT:    ret i8 [[R]]
193;
194  %i = icmp ule i8 %y, %x
195  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
196  %r = select i1 %i, i8 %x, i8 %m
197  ret i8 %r
198}
199
200define i8 @ugt_yx_smin_fval(i8 %x, i8 %y) {
201; CHECK-LABEL: @ugt_yx_smin_fval(
202; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
203; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
204; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
205; CHECK-NEXT:    ret i8 [[R]]
206;
207  %i = icmp ugt i8 %y, %x
208  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
209  %r = select i1 %i, i8 %x, i8 %m
210  ret i8 %r
211}
212
213define i8 @uge_yx_smin_fval(i8 %x, i8 %y) {
214; CHECK-LABEL: @uge_yx_smin_fval(
215; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
216; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
217; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
218; CHECK-NEXT:    ret i8 [[R]]
219;
220  %i = icmp uge i8 %y, %x
221  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
222  %r = select i1 %i, i8 %x, i8 %m
223  ret i8 %r
224}
225
226define i8 @eq_yx_smin_fval(i8 %x, i8 %y) {
227; CHECK-LABEL: @eq_yx_smin_fval(
228; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
229; CHECK-NEXT:    ret i8 [[M]]
230;
231  %i = icmp eq i8 %y, %x
232  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
233  %r = select i1 %i, i8 %x, i8 %m
234  ret i8 %r
235}
236
237define i8 @ne_yx_smin_fval(i8 %x, i8 %y) {
238; CHECK-LABEL: @ne_yx_smin_fval(
239; CHECK-NEXT:    ret i8 [[X:%.*]]
240;
241  %i = icmp ne i8 %y, %x
242  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
243  %r = select i1 %i, i8 %x, i8 %m
244  ret i8 %r
245}
246
247; swap select operands
248
249define i8 @slt_xy_smin_tval(i8 %x, i8 %y) {
250; CHECK-LABEL: @slt_xy_smin_tval(
251; CHECK-NEXT:    ret i8 [[X:%.*]]
252;
253  %i = icmp slt i8 %x, %y
254  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
255  %r = select i1 %i, i8 %m, i8 %x
256  ret i8 %r
257}
258
259define i8 @sle_xy_smin_tval(i8 %x, i8 %y) {
260; CHECK-LABEL: @sle_xy_smin_tval(
261; CHECK-NEXT:    ret i8 [[X:%.*]]
262;
263  %i = icmp sle i8 %x, %y
264  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
265  %r = select i1 %i, i8 %m, i8 %x
266  ret i8 %r
267}
268
269define i8 @sgt_xy_smin_tval(i8 %x, i8 %y) {
270; CHECK-LABEL: @sgt_xy_smin_tval(
271; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
272; CHECK-NEXT:    ret i8 [[M]]
273;
274  %i = icmp sgt i8 %x, %y
275  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
276  %r = select i1 %i, i8 %m, i8 %x
277  ret i8 %r
278}
279
280define i8 @sge_xy_smin_tval(i8 %x, i8 %y) {
281; CHECK-LABEL: @sge_xy_smin_tval(
282; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
283; CHECK-NEXT:    ret i8 [[M]]
284;
285  %i = icmp sge i8 %x, %y
286  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
287  %r = select i1 %i, i8 %m, i8 %x
288  ret i8 %r
289}
290
291define i8 @ult_xy_smin_tval(i8 %x, i8 %y) {
292; CHECK-LABEL: @ult_xy_smin_tval(
293; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
294; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
295; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
296; CHECK-NEXT:    ret i8 [[R]]
297;
298  %i = icmp ult i8 %x, %y
299  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
300  %r = select i1 %i, i8 %m, i8 %x
301  ret i8 %r
302}
303
304define i8 @ule_xy_smin_tval(i8 %x, i8 %y) {
305; CHECK-LABEL: @ule_xy_smin_tval(
306; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
307; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
308; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
309; CHECK-NEXT:    ret i8 [[R]]
310;
311  %i = icmp ule i8 %x, %y
312  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
313  %r = select i1 %i, i8 %m, i8 %x
314  ret i8 %r
315}
316
317define i8 @ugt_xy_smin_tval(i8 %x, i8 %y) {
318; CHECK-LABEL: @ugt_xy_smin_tval(
319; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
320; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
321; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
322; CHECK-NEXT:    ret i8 [[R]]
323;
324  %i = icmp ugt i8 %x, %y
325  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
326  %r = select i1 %i, i8 %m, i8 %x
327  ret i8 %r
328}
329
330define i8 @uge_xy_smin_tval(i8 %x, i8 %y) {
331; CHECK-LABEL: @uge_xy_smin_tval(
332; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
333; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
334; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
335; CHECK-NEXT:    ret i8 [[R]]
336;
337  %i = icmp uge i8 %x, %y
338  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
339  %r = select i1 %i, i8 %m, i8 %x
340  ret i8 %r
341}
342
343define i8 @eq_xy_smin_tval(i8 %x, i8 %y) {
344; CHECK-LABEL: @eq_xy_smin_tval(
345; CHECK-NEXT:    ret i8 [[X:%.*]]
346;
347  %i = icmp eq i8 %x, %y
348  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
349  %r = select i1 %i, i8 %m, i8 %x
350  ret i8 %r
351}
352
353define i8 @ne_xy_smin_tval(i8 %x, i8 %y) {
354; CHECK-LABEL: @ne_xy_smin_tval(
355; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
356; CHECK-NEXT:    ret i8 [[M]]
357;
358  %i = icmp ne i8 %x, %y
359  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
360  %r = select i1 %i, i8 %m, i8 %x
361  ret i8 %r
362}
363
364; swap icmp and select operands
365
366define i8 @slt_yx_smin_tval(i8 %x, i8 %y) {
367; CHECK-LABEL: @slt_yx_smin_tval(
368; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
369; CHECK-NEXT:    ret i8 [[M]]
370;
371  %i = icmp slt i8 %y, %x
372  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
373  %r = select i1 %i, i8 %m, i8 %x
374  ret i8 %r
375}
376
377define i8 @sle_yx_smin_tval(i8 %x, i8 %y) {
378; CHECK-LABEL: @sle_yx_smin_tval(
379; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
380; CHECK-NEXT:    ret i8 [[M]]
381;
382  %i = icmp sle i8 %y, %x
383  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
384  %r = select i1 %i, i8 %m, i8 %x
385  ret i8 %r
386}
387
388define i8 @sgt_yx_smin_tval(i8 %x, i8 %y) {
389; CHECK-LABEL: @sgt_yx_smin_tval(
390; CHECK-NEXT:    ret i8 [[X:%.*]]
391;
392  %i = icmp sgt i8 %y, %x
393  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
394  %r = select i1 %i, i8 %m, i8 %x
395  ret i8 %r
396}
397
398define i8 @sge_yx_smin_tval(i8 %x, i8 %y) {
399; CHECK-LABEL: @sge_yx_smin_tval(
400; CHECK-NEXT:    ret i8 [[X:%.*]]
401;
402  %i = icmp sge i8 %y, %x
403  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
404  %r = select i1 %i, i8 %m, i8 %x
405  ret i8 %r
406}
407
408define i8 @ult_yx_smin_tval(i8 %x, i8 %y) {
409; CHECK-LABEL: @ult_yx_smin_tval(
410; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
411; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
412; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
413; CHECK-NEXT:    ret i8 [[R]]
414;
415  %i = icmp ult i8 %y, %x
416  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
417  %r = select i1 %i, i8 %m, i8 %x
418  ret i8 %r
419}
420
421define i8 @ule_yx_smin_tval(i8 %x, i8 %y) {
422; CHECK-LABEL: @ule_yx_smin_tval(
423; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
424; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
425; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
426; CHECK-NEXT:    ret i8 [[R]]
427;
428  %i = icmp ule i8 %y, %x
429  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
430  %r = select i1 %i, i8 %m, i8 %x
431  ret i8 %r
432}
433
434define i8 @ugt_yx_smin_tval(i8 %x, i8 %y) {
435; CHECK-LABEL: @ugt_yx_smin_tval(
436; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
437; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 [[Y]])
438; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
439; CHECK-NEXT:    ret i8 [[R]]
440;
441  %i = icmp ugt i8 %y, %x
442  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
443  %r = select i1 %i, i8 %m, i8 %x
444  ret i8 %r
445}
446
447define i8 @uge_yx_smin_tval(i8 %x, i8 %y) {
448; CHECK-LABEL: @uge_yx_smin_tval(
449; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
450; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y]], i8 [[X]])
451; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
452; CHECK-NEXT:    ret i8 [[R]]
453;
454  %i = icmp uge i8 %y, %x
455  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
456  %r = select i1 %i, i8 %m, i8 %x
457  ret i8 %r
458}
459
460define i8 @eq_yx_smin_tval(i8 %x, i8 %y) {
461; CHECK-LABEL: @eq_yx_smin_tval(
462; CHECK-NEXT:    ret i8 [[X:%.*]]
463;
464  %i = icmp eq i8 %y, %x
465  %m = call i8 @llvm.smin.i8(i8 %x, i8 %y)
466  %r = select i1 %i, i8 %m, i8 %x
467  ret i8 %r
468}
469
470define i8 @ne_yx_smin_tval(i8 %x, i8 %y) {
471; CHECK-LABEL: @ne_yx_smin_tval(
472; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
473; CHECK-NEXT:    ret i8 [[M]]
474;
475  %i = icmp ne i8 %y, %x
476  %m = call i8 @llvm.smin.i8(i8 %y, i8 %x)
477  %r = select i1 %i, i8 %m, i8 %x
478  ret i8 %r
479}
480
481; smax
482
483define i8 @slt_xy_smax_fval(i8 %x, i8 %y) {
484; CHECK-LABEL: @slt_xy_smax_fval(
485; CHECK-NEXT:    ret i8 [[X:%.*]]
486;
487  %i = icmp slt i8 %x, %y
488  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
489  %r = select i1 %i, i8 %x, i8 %m
490  ret i8 %r
491}
492
493define i8 @sle_xy_smax_fval(i8 %x, i8 %y) {
494; CHECK-LABEL: @sle_xy_smax_fval(
495; CHECK-NEXT:    ret i8 [[X:%.*]]
496;
497  %i = icmp sle i8 %x, %y
498  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
499  %r = select i1 %i, i8 %x, i8 %m
500  ret i8 %r
501}
502
503define i8 @sgt_xy_smax_fval(i8 %x, i8 %y) {
504; CHECK-LABEL: @sgt_xy_smax_fval(
505; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
506; CHECK-NEXT:    ret i8 [[M]]
507;
508  %i = icmp sgt i8 %x, %y
509  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
510  %r = select i1 %i, i8 %x, i8 %m
511  ret i8 %r
512}
513
514define i8 @sge_xy_smax_fval(i8 %x, i8 %y) {
515; CHECK-LABEL: @sge_xy_smax_fval(
516; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
517; CHECK-NEXT:    ret i8 [[M]]
518;
519  %i = icmp sge i8 %x, %y
520  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
521  %r = select i1 %i, i8 %x, i8 %m
522  ret i8 %r
523}
524
525define i8 @ult_xy_smax_fval(i8 %x, i8 %y) {
526; CHECK-LABEL: @ult_xy_smax_fval(
527; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
528; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
529; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
530; CHECK-NEXT:    ret i8 [[R]]
531;
532  %i = icmp ult i8 %x, %y
533  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
534  %r = select i1 %i, i8 %x, i8 %m
535  ret i8 %r
536}
537
538define i8 @ule_xy_smax_fval(i8 %x, i8 %y) {
539; CHECK-LABEL: @ule_xy_smax_fval(
540; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
541; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
542; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
543; CHECK-NEXT:    ret i8 [[R]]
544;
545  %i = icmp ule i8 %x, %y
546  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
547  %r = select i1 %i, i8 %x, i8 %m
548  ret i8 %r
549}
550
551define i8 @ugt_xy_smax_fval(i8 %x, i8 %y) {
552; CHECK-LABEL: @ugt_xy_smax_fval(
553; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
554; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
555; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
556; CHECK-NEXT:    ret i8 [[R]]
557;
558  %i = icmp ugt i8 %x, %y
559  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
560  %r = select i1 %i, i8 %x, i8 %m
561  ret i8 %r
562}
563
564define i8 @uge_xy_smax_fval(i8 %x, i8 %y) {
565; CHECK-LABEL: @uge_xy_smax_fval(
566; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
567; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
568; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
569; CHECK-NEXT:    ret i8 [[R]]
570;
571  %i = icmp uge i8 %x, %y
572  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
573  %r = select i1 %i, i8 %x, i8 %m
574  ret i8 %r
575}
576
577define i8 @eq_xy_smax_fval(i8 %x, i8 %y) {
578; CHECK-LABEL: @eq_xy_smax_fval(
579; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
580; CHECK-NEXT:    ret i8 [[M]]
581;
582  %i = icmp eq i8 %x, %y
583  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
584  %r = select i1 %i, i8 %x, i8 %m
585  ret i8 %r
586}
587
588define i8 @ne_xy_smax_fval(i8 %x, i8 %y) {
589; CHECK-LABEL: @ne_xy_smax_fval(
590; CHECK-NEXT:    ret i8 [[X:%.*]]
591;
592  %i = icmp ne i8 %x, %y
593  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
594  %r = select i1 %i, i8 %x, i8 %m
595  ret i8 %r
596}
597
598; swap icmp operands
599
600define i8 @slt_yx_smax_fval(i8 %x, i8 %y) {
601; CHECK-LABEL: @slt_yx_smax_fval(
602; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
603; CHECK-NEXT:    ret i8 [[M]]
604;
605  %i = icmp slt i8 %y, %x
606  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
607  %r = select i1 %i, i8 %x, i8 %m
608  ret i8 %r
609}
610
611define i8 @sle_yx_smax_fval(i8 %x, i8 %y) {
612; CHECK-LABEL: @sle_yx_smax_fval(
613; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
614; CHECK-NEXT:    ret i8 [[M]]
615;
616  %i = icmp sle i8 %y, %x
617  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
618  %r = select i1 %i, i8 %x, i8 %m
619  ret i8 %r
620}
621
622define i8 @sgt_yx_smax_fval(i8 %x, i8 %y) {
623; CHECK-LABEL: @sgt_yx_smax_fval(
624; CHECK-NEXT:    ret i8 [[X:%.*]]
625;
626  %i = icmp sgt i8 %y, %x
627  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
628  %r = select i1 %i, i8 %x, i8 %m
629  ret i8 %r
630}
631
632define i8 @sge_yx_smax_fval(i8 %x, i8 %y) {
633; CHECK-LABEL: @sge_yx_smax_fval(
634; CHECK-NEXT:    ret i8 [[X:%.*]]
635;
636  %i = icmp sge i8 %y, %x
637  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
638  %r = select i1 %i, i8 %x, i8 %m
639  ret i8 %r
640}
641
642define i8 @ult_yx_smax_fval(i8 %x, i8 %y) {
643; CHECK-LABEL: @ult_yx_smax_fval(
644; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
645; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
646; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
647; CHECK-NEXT:    ret i8 [[R]]
648;
649  %i = icmp ult i8 %y, %x
650  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
651  %r = select i1 %i, i8 %x, i8 %m
652  ret i8 %r
653}
654
655define i8 @ule_yx_smax_fval(i8 %x, i8 %y) {
656; CHECK-LABEL: @ule_yx_smax_fval(
657; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
658; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
659; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
660; CHECK-NEXT:    ret i8 [[R]]
661;
662  %i = icmp ule i8 %y, %x
663  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
664  %r = select i1 %i, i8 %x, i8 %m
665  ret i8 %r
666}
667
668define i8 @ugt_yx_smax_fval(i8 %x, i8 %y) {
669; CHECK-LABEL: @ugt_yx_smax_fval(
670; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
671; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
672; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
673; CHECK-NEXT:    ret i8 [[R]]
674;
675  %i = icmp ugt i8 %y, %x
676  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
677  %r = select i1 %i, i8 %x, i8 %m
678  ret i8 %r
679}
680
681define i8 @uge_yx_smax_fval(i8 %x, i8 %y) {
682; CHECK-LABEL: @uge_yx_smax_fval(
683; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
684; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
685; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
686; CHECK-NEXT:    ret i8 [[R]]
687;
688  %i = icmp uge i8 %y, %x
689  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
690  %r = select i1 %i, i8 %x, i8 %m
691  ret i8 %r
692}
693
694define i8 @eq_yx_smax_fval(i8 %x, i8 %y) {
695; CHECK-LABEL: @eq_yx_smax_fval(
696; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
697; CHECK-NEXT:    ret i8 [[M]]
698;
699  %i = icmp eq i8 %y, %x
700  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
701  %r = select i1 %i, i8 %x, i8 %m
702  ret i8 %r
703}
704
705define i8 @ne_yx_smax_fval(i8 %x, i8 %y) {
706; CHECK-LABEL: @ne_yx_smax_fval(
707; CHECK-NEXT:    ret i8 [[X:%.*]]
708;
709  %i = icmp ne i8 %y, %x
710  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
711  %r = select i1 %i, i8 %x, i8 %m
712  ret i8 %r
713}
714
715; swap select operands
716
717define i8 @slt_xy_smax_tval(i8 %x, i8 %y) {
718; CHECK-LABEL: @slt_xy_smax_tval(
719; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
720; CHECK-NEXT:    ret i8 [[M]]
721;
722  %i = icmp slt i8 %x, %y
723  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
724  %r = select i1 %i, i8 %m, i8 %x
725  ret i8 %r
726}
727
728define i8 @sle_xy_smax_tval(i8 %x, i8 %y) {
729; CHECK-LABEL: @sle_xy_smax_tval(
730; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
731; CHECK-NEXT:    ret i8 [[M]]
732;
733  %i = icmp sle i8 %x, %y
734  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
735  %r = select i1 %i, i8 %m, i8 %x
736  ret i8 %r
737}
738
739define i8 @sgt_xy_smax_tval(i8 %x, i8 %y) {
740; CHECK-LABEL: @sgt_xy_smax_tval(
741; CHECK-NEXT:    ret i8 [[X:%.*]]
742;
743  %i = icmp sgt i8 %x, %y
744  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
745  %r = select i1 %i, i8 %m, i8 %x
746  ret i8 %r
747}
748
749define i8 @sge_xy_smax_tval(i8 %x, i8 %y) {
750; CHECK-LABEL: @sge_xy_smax_tval(
751; CHECK-NEXT:    ret i8 [[X:%.*]]
752;
753  %i = icmp sge i8 %x, %y
754  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
755  %r = select i1 %i, i8 %m, i8 %x
756  ret i8 %r
757}
758
759define i8 @ult_xy_smax_tval(i8 %x, i8 %y) {
760; CHECK-LABEL: @ult_xy_smax_tval(
761; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
762; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
763; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
764; CHECK-NEXT:    ret i8 [[R]]
765;
766  %i = icmp ult i8 %x, %y
767  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
768  %r = select i1 %i, i8 %m, i8 %x
769  ret i8 %r
770}
771
772define i8 @ule_xy_smax_tval(i8 %x, i8 %y) {
773; CHECK-LABEL: @ule_xy_smax_tval(
774; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
775; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
776; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
777; CHECK-NEXT:    ret i8 [[R]]
778;
779  %i = icmp ule i8 %x, %y
780  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
781  %r = select i1 %i, i8 %m, i8 %x
782  ret i8 %r
783}
784
785define i8 @ugt_xy_smax_tval(i8 %x, i8 %y) {
786; CHECK-LABEL: @ugt_xy_smax_tval(
787; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
788; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
789; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
790; CHECK-NEXT:    ret i8 [[R]]
791;
792  %i = icmp ugt i8 %x, %y
793  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
794  %r = select i1 %i, i8 %m, i8 %x
795  ret i8 %r
796}
797
798define i8 @uge_xy_smax_tval(i8 %x, i8 %y) {
799; CHECK-LABEL: @uge_xy_smax_tval(
800; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
801; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
802; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
803; CHECK-NEXT:    ret i8 [[R]]
804;
805  %i = icmp uge i8 %x, %y
806  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
807  %r = select i1 %i, i8 %m, i8 %x
808  ret i8 %r
809}
810
811define i8 @eq_xy_smax_tval(i8 %x, i8 %y) {
812; CHECK-LABEL: @eq_xy_smax_tval(
813; CHECK-NEXT:    ret i8 [[X:%.*]]
814;
815  %i = icmp eq i8 %x, %y
816  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
817  %r = select i1 %i, i8 %m, i8 %x
818  ret i8 %r
819}
820
821define i8 @ne_xy_smax_tval(i8 %x, i8 %y) {
822; CHECK-LABEL: @ne_xy_smax_tval(
823; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
824; CHECK-NEXT:    ret i8 [[M]]
825;
826  %i = icmp ne i8 %x, %y
827  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
828  %r = select i1 %i, i8 %m, i8 %x
829  ret i8 %r
830}
831
832; swap icmp and select operands
833
834define i8 @slt_yx_smax_tval(i8 %x, i8 %y) {
835; CHECK-LABEL: @slt_yx_smax_tval(
836; CHECK-NEXT:    ret i8 [[X:%.*]]
837;
838  %i = icmp slt i8 %y, %x
839  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
840  %r = select i1 %i, i8 %m, i8 %x
841  ret i8 %r
842}
843
844define i8 @sle_yx_smax_tval(i8 %x, i8 %y) {
845; CHECK-LABEL: @sle_yx_smax_tval(
846; CHECK-NEXT:    ret i8 [[X:%.*]]
847;
848  %i = icmp sle i8 %y, %x
849  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
850  %r = select i1 %i, i8 %m, i8 %x
851  ret i8 %r
852}
853
854define i8 @sgt_yx_smax_tval(i8 %x, i8 %y) {
855; CHECK-LABEL: @sgt_yx_smax_tval(
856; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
857; CHECK-NEXT:    ret i8 [[M]]
858;
859  %i = icmp sgt i8 %y, %x
860  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
861  %r = select i1 %i, i8 %m, i8 %x
862  ret i8 %r
863}
864
865define i8 @sge_yx_smax_tval(i8 %x, i8 %y) {
866; CHECK-LABEL: @sge_yx_smax_tval(
867; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
868; CHECK-NEXT:    ret i8 [[M]]
869;
870  %i = icmp sge i8 %y, %x
871  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
872  %r = select i1 %i, i8 %m, i8 %x
873  ret i8 %r
874}
875
876define i8 @ult_yx_smax_tval(i8 %x, i8 %y) {
877; CHECK-LABEL: @ult_yx_smax_tval(
878; CHECK-NEXT:    [[I:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
879; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
880; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
881; CHECK-NEXT:    ret i8 [[R]]
882;
883  %i = icmp ult i8 %y, %x
884  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
885  %r = select i1 %i, i8 %m, i8 %x
886  ret i8 %r
887}
888
889define i8 @ule_yx_smax_tval(i8 %x, i8 %y) {
890; CHECK-LABEL: @ule_yx_smax_tval(
891; CHECK-NEXT:    [[I:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
892; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
893; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
894; CHECK-NEXT:    ret i8 [[R]]
895;
896  %i = icmp ule i8 %y, %x
897  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
898  %r = select i1 %i, i8 %m, i8 %x
899  ret i8 %r
900}
901
902define i8 @ugt_yx_smax_tval(i8 %x, i8 %y) {
903; CHECK-LABEL: @ugt_yx_smax_tval(
904; CHECK-NEXT:    [[I:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
905; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[Y]])
906; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
907; CHECK-NEXT:    ret i8 [[R]]
908;
909  %i = icmp ugt i8 %y, %x
910  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
911  %r = select i1 %i, i8 %m, i8 %x
912  ret i8 %r
913}
914
915define i8 @uge_yx_smax_tval(i8 %x, i8 %y) {
916; CHECK-LABEL: @uge_yx_smax_tval(
917; CHECK-NEXT:    [[I:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
918; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y]], i8 [[X]])
919; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
920; CHECK-NEXT:    ret i8 [[R]]
921;
922  %i = icmp uge i8 %y, %x
923  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
924  %r = select i1 %i, i8 %m, i8 %x
925  ret i8 %r
926}
927
928define i8 @eq_yx_smax_tval(i8 %x, i8 %y) {
929; CHECK-LABEL: @eq_yx_smax_tval(
930; CHECK-NEXT:    ret i8 [[X:%.*]]
931;
932  %i = icmp eq i8 %y, %x
933  %m = call i8 @llvm.smax.i8(i8 %x, i8 %y)
934  %r = select i1 %i, i8 %m, i8 %x
935  ret i8 %r
936}
937
938define i8 @ne_yx_smax_tval(i8 %x, i8 %y) {
939; CHECK-LABEL: @ne_yx_smax_tval(
940; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.smax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
941; CHECK-NEXT:    ret i8 [[M]]
942;
943  %i = icmp ne i8 %y, %x
944  %m = call i8 @llvm.smax.i8(i8 %y, i8 %x)
945  %r = select i1 %i, i8 %m, i8 %x
946  ret i8 %r
947}
948
949; umin
950
951define i8 @slt_xy_umin_fval(i8 %x, i8 %y) {
952; CHECK-LABEL: @slt_xy_umin_fval(
953; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
954; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
955; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
956; CHECK-NEXT:    ret i8 [[R]]
957;
958  %i = icmp slt i8 %x, %y
959  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
960  %r = select i1 %i, i8 %x, i8 %m
961  ret i8 %r
962}
963
964define i8 @sle_xy_umin_fval(i8 %x, i8 %y) {
965; CHECK-LABEL: @sle_xy_umin_fval(
966; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
967; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
968; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
969; CHECK-NEXT:    ret i8 [[R]]
970;
971  %i = icmp sle i8 %x, %y
972  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
973  %r = select i1 %i, i8 %x, i8 %m
974  ret i8 %r
975}
976
977define i8 @sgt_xy_umin_fval(i8 %x, i8 %y) {
978; CHECK-LABEL: @sgt_xy_umin_fval(
979; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
980; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
981; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
982; CHECK-NEXT:    ret i8 [[R]]
983;
984  %i = icmp sgt i8 %x, %y
985  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
986  %r = select i1 %i, i8 %x, i8 %m
987  ret i8 %r
988}
989
990define i8 @sge_xy_umin_fval(i8 %x, i8 %y) {
991; CHECK-LABEL: @sge_xy_umin_fval(
992; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
993; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
994; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
995; CHECK-NEXT:    ret i8 [[R]]
996;
997  %i = icmp sge i8 %x, %y
998  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
999  %r = select i1 %i, i8 %x, i8 %m
1000  ret i8 %r
1001}
1002
1003define i8 @ult_xy_umin_fval(i8 %x, i8 %y) {
1004; CHECK-LABEL: @ult_xy_umin_fval(
1005; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1006; CHECK-NEXT:    ret i8 [[M]]
1007;
1008  %i = icmp ult i8 %x, %y
1009  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1010  %r = select i1 %i, i8 %x, i8 %m
1011  ret i8 %r
1012}
1013
1014define i8 @ule_xy_umin_fval(i8 %x, i8 %y) {
1015; CHECK-LABEL: @ule_xy_umin_fval(
1016; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1017; CHECK-NEXT:    ret i8 [[M]]
1018;
1019  %i = icmp ule i8 %x, %y
1020  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1021  %r = select i1 %i, i8 %x, i8 %m
1022  ret i8 %r
1023}
1024
1025define i8 @ugt_xy_umin_fval(i8 %x, i8 %y) {
1026; CHECK-LABEL: @ugt_xy_umin_fval(
1027; CHECK-NEXT:    ret i8 [[X:%.*]]
1028;
1029  %i = icmp ugt i8 %x, %y
1030  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1031  %r = select i1 %i, i8 %x, i8 %m
1032  ret i8 %r
1033}
1034
1035define i8 @uge_xy_umin_fval(i8 %x, i8 %y) {
1036; CHECK-LABEL: @uge_xy_umin_fval(
1037; CHECK-NEXT:    ret i8 [[X:%.*]]
1038;
1039  %i = icmp uge i8 %x, %y
1040  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1041  %r = select i1 %i, i8 %x, i8 %m
1042  ret i8 %r
1043}
1044
1045define i8 @eq_xy_umin_fval(i8 %x, i8 %y) {
1046; CHECK-LABEL: @eq_xy_umin_fval(
1047; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1048; CHECK-NEXT:    ret i8 [[M]]
1049;
1050  %i = icmp eq i8 %x, %y
1051  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1052  %r = select i1 %i, i8 %x, i8 %m
1053  ret i8 %r
1054}
1055
1056define i8 @ne_xy_umin_fval(i8 %x, i8 %y) {
1057; CHECK-LABEL: @ne_xy_umin_fval(
1058; CHECK-NEXT:    ret i8 [[X:%.*]]
1059;
1060  %i = icmp ne i8 %x, %y
1061  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1062  %r = select i1 %i, i8 %x, i8 %m
1063  ret i8 %r
1064}
1065
1066; swap icmp operands
1067
1068define i8 @slt_yx_umin_fval(i8 %x, i8 %y) {
1069; CHECK-LABEL: @slt_yx_umin_fval(
1070; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
1071; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
1072; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1073; CHECK-NEXT:    ret i8 [[R]]
1074;
1075  %i = icmp slt i8 %y, %x
1076  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1077  %r = select i1 %i, i8 %x, i8 %m
1078  ret i8 %r
1079}
1080
1081define i8 @sle_yx_umin_fval(i8 %x, i8 %y) {
1082; CHECK-LABEL: @sle_yx_umin_fval(
1083; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
1084; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
1085; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1086; CHECK-NEXT:    ret i8 [[R]]
1087;
1088  %i = icmp sle i8 %y, %x
1089  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1090  %r = select i1 %i, i8 %x, i8 %m
1091  ret i8 %r
1092}
1093
1094define i8 @sgt_yx_umin_fval(i8 %x, i8 %y) {
1095; CHECK-LABEL: @sgt_yx_umin_fval(
1096; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
1097; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
1098; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1099; CHECK-NEXT:    ret i8 [[R]]
1100;
1101  %i = icmp sgt i8 %y, %x
1102  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1103  %r = select i1 %i, i8 %x, i8 %m
1104  ret i8 %r
1105}
1106
1107define i8 @sge_yx_umin_fval(i8 %x, i8 %y) {
1108; CHECK-LABEL: @sge_yx_umin_fval(
1109; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
1110; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
1111; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1112; CHECK-NEXT:    ret i8 [[R]]
1113;
1114  %i = icmp sge i8 %y, %x
1115  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1116  %r = select i1 %i, i8 %x, i8 %m
1117  ret i8 %r
1118}
1119
1120define i8 @ult_yx_umin_fval(i8 %x, i8 %y) {
1121; CHECK-LABEL: @ult_yx_umin_fval(
1122; CHECK-NEXT:    ret i8 [[X:%.*]]
1123;
1124  %i = icmp ult i8 %y, %x
1125  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1126  %r = select i1 %i, i8 %x, i8 %m
1127  ret i8 %r
1128}
1129
1130define i8 @ule_yx_umin_fval(i8 %x, i8 %y) {
1131; CHECK-LABEL: @ule_yx_umin_fval(
1132; CHECK-NEXT:    ret i8 [[X:%.*]]
1133;
1134  %i = icmp ule i8 %y, %x
1135  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1136  %r = select i1 %i, i8 %x, i8 %m
1137  ret i8 %r
1138}
1139
1140define i8 @ugt_yx_umin_fval(i8 %x, i8 %y) {
1141; CHECK-LABEL: @ugt_yx_umin_fval(
1142; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1143; CHECK-NEXT:    ret i8 [[M]]
1144;
1145  %i = icmp ugt i8 %y, %x
1146  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1147  %r = select i1 %i, i8 %x, i8 %m
1148  ret i8 %r
1149}
1150
1151define i8 @uge_yx_umin_fval(i8 %x, i8 %y) {
1152; CHECK-LABEL: @uge_yx_umin_fval(
1153; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1154; CHECK-NEXT:    ret i8 [[M]]
1155;
1156  %i = icmp uge i8 %y, %x
1157  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1158  %r = select i1 %i, i8 %x, i8 %m
1159  ret i8 %r
1160}
1161
1162define i8 @eq_yx_umin_fval(i8 %x, i8 %y) {
1163; CHECK-LABEL: @eq_yx_umin_fval(
1164; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1165; CHECK-NEXT:    ret i8 [[M]]
1166;
1167  %i = icmp eq i8 %y, %x
1168  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1169  %r = select i1 %i, i8 %x, i8 %m
1170  ret i8 %r
1171}
1172
1173define i8 @ne_yx_umin_fval(i8 %x, i8 %y) {
1174; CHECK-LABEL: @ne_yx_umin_fval(
1175; CHECK-NEXT:    ret i8 [[X:%.*]]
1176;
1177  %i = icmp ne i8 %y, %x
1178  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1179  %r = select i1 %i, i8 %x, i8 %m
1180  ret i8 %r
1181}
1182
1183; swap select operands
1184
1185define i8 @slt_xy_umin_tval(i8 %x, i8 %y) {
1186; CHECK-LABEL: @slt_xy_umin_tval(
1187; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
1188; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
1189; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1190; CHECK-NEXT:    ret i8 [[R]]
1191;
1192  %i = icmp slt i8 %x, %y
1193  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1194  %r = select i1 %i, i8 %m, i8 %x
1195  ret i8 %r
1196}
1197
1198define i8 @sle_xy_umin_tval(i8 %x, i8 %y) {
1199; CHECK-LABEL: @sle_xy_umin_tval(
1200; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
1201; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
1202; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1203; CHECK-NEXT:    ret i8 [[R]]
1204;
1205  %i = icmp sle i8 %x, %y
1206  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1207  %r = select i1 %i, i8 %m, i8 %x
1208  ret i8 %r
1209}
1210
1211define i8 @sgt_xy_umin_tval(i8 %x, i8 %y) {
1212; CHECK-LABEL: @sgt_xy_umin_tval(
1213; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
1214; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
1215; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1216; CHECK-NEXT:    ret i8 [[R]]
1217;
1218  %i = icmp sgt i8 %x, %y
1219  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1220  %r = select i1 %i, i8 %m, i8 %x
1221  ret i8 %r
1222}
1223
1224define i8 @sge_xy_umin_tval(i8 %x, i8 %y) {
1225; CHECK-LABEL: @sge_xy_umin_tval(
1226; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
1227; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
1228; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1229; CHECK-NEXT:    ret i8 [[R]]
1230;
1231  %i = icmp sge i8 %x, %y
1232  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1233  %r = select i1 %i, i8 %m, i8 %x
1234  ret i8 %r
1235}
1236
1237define i8 @ult_xy_umin_tval(i8 %x, i8 %y) {
1238; CHECK-LABEL: @ult_xy_umin_tval(
1239; CHECK-NEXT:    ret i8 [[X:%.*]]
1240;
1241  %i = icmp ult i8 %x, %y
1242  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1243  %r = select i1 %i, i8 %m, i8 %x
1244  ret i8 %r
1245}
1246
1247define i8 @ule_xy_umin_tval(i8 %x, i8 %y) {
1248; CHECK-LABEL: @ule_xy_umin_tval(
1249; CHECK-NEXT:    ret i8 [[X:%.*]]
1250;
1251  %i = icmp ule i8 %x, %y
1252  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1253  %r = select i1 %i, i8 %m, i8 %x
1254  ret i8 %r
1255}
1256
1257define i8 @ugt_xy_umin_tval(i8 %x, i8 %y) {
1258; CHECK-LABEL: @ugt_xy_umin_tval(
1259; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1260; CHECK-NEXT:    ret i8 [[M]]
1261;
1262  %i = icmp ugt i8 %x, %y
1263  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1264  %r = select i1 %i, i8 %m, i8 %x
1265  ret i8 %r
1266}
1267
1268define i8 @uge_xy_umin_tval(i8 %x, i8 %y) {
1269; CHECK-LABEL: @uge_xy_umin_tval(
1270; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1271; CHECK-NEXT:    ret i8 [[M]]
1272;
1273  %i = icmp uge i8 %x, %y
1274  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1275  %r = select i1 %i, i8 %m, i8 %x
1276  ret i8 %r
1277}
1278
1279define i8 @eq_xy_umin_tval(i8 %x, i8 %y) {
1280; CHECK-LABEL: @eq_xy_umin_tval(
1281; CHECK-NEXT:    ret i8 [[X:%.*]]
1282;
1283  %i = icmp eq i8 %x, %y
1284  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1285  %r = select i1 %i, i8 %m, i8 %x
1286  ret i8 %r
1287}
1288
1289define i8 @ne_xy_umin_tval(i8 %x, i8 %y) {
1290; CHECK-LABEL: @ne_xy_umin_tval(
1291; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1292; CHECK-NEXT:    ret i8 [[M]]
1293;
1294  %i = icmp ne i8 %x, %y
1295  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1296  %r = select i1 %i, i8 %m, i8 %x
1297  ret i8 %r
1298}
1299
1300; swap icmp and select operands
1301
1302define i8 @slt_yx_umin_tval(i8 %x, i8 %y) {
1303; CHECK-LABEL: @slt_yx_umin_tval(
1304; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
1305; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
1306; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1307; CHECK-NEXT:    ret i8 [[R]]
1308;
1309  %i = icmp slt i8 %y, %x
1310  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1311  %r = select i1 %i, i8 %m, i8 %x
1312  ret i8 %r
1313}
1314
1315define i8 @sle_yx_umin_tval(i8 %x, i8 %y) {
1316; CHECK-LABEL: @sle_yx_umin_tval(
1317; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
1318; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
1319; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1320; CHECK-NEXT:    ret i8 [[R]]
1321;
1322  %i = icmp sle i8 %y, %x
1323  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1324  %r = select i1 %i, i8 %m, i8 %x
1325  ret i8 %r
1326}
1327
1328define i8 @sgt_yx_umin_tval(i8 %x, i8 %y) {
1329; CHECK-LABEL: @sgt_yx_umin_tval(
1330; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
1331; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X]], i8 [[Y]])
1332; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1333; CHECK-NEXT:    ret i8 [[R]]
1334;
1335  %i = icmp sgt i8 %y, %x
1336  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1337  %r = select i1 %i, i8 %m, i8 %x
1338  ret i8 %r
1339}
1340
1341define i8 @sge_yx_umin_tval(i8 %x, i8 %y) {
1342; CHECK-LABEL: @sge_yx_umin_tval(
1343; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
1344; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y]], i8 [[X]])
1345; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1346; CHECK-NEXT:    ret i8 [[R]]
1347;
1348  %i = icmp sge i8 %y, %x
1349  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1350  %r = select i1 %i, i8 %m, i8 %x
1351  ret i8 %r
1352}
1353
1354define i8 @ult_yx_umin_tval(i8 %x, i8 %y) {
1355; CHECK-LABEL: @ult_yx_umin_tval(
1356; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1357; CHECK-NEXT:    ret i8 [[M]]
1358;
1359  %i = icmp ult i8 %y, %x
1360  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1361  %r = select i1 %i, i8 %m, i8 %x
1362  ret i8 %r
1363}
1364
1365define i8 @ule_yx_umin_tval(i8 %x, i8 %y) {
1366; CHECK-LABEL: @ule_yx_umin_tval(
1367; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1368; CHECK-NEXT:    ret i8 [[M]]
1369;
1370  %i = icmp ule i8 %y, %x
1371  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1372  %r = select i1 %i, i8 %m, i8 %x
1373  ret i8 %r
1374}
1375
1376define i8 @ugt_yx_umin_tval(i8 %x, i8 %y) {
1377; CHECK-LABEL: @ugt_yx_umin_tval(
1378; CHECK-NEXT:    ret i8 [[X:%.*]]
1379;
1380  %i = icmp ugt i8 %y, %x
1381  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1382  %r = select i1 %i, i8 %m, i8 %x
1383  ret i8 %r
1384}
1385
1386define i8 @uge_yx_umin_tval(i8 %x, i8 %y) {
1387; CHECK-LABEL: @uge_yx_umin_tval(
1388; CHECK-NEXT:    ret i8 [[X:%.*]]
1389;
1390  %i = icmp uge i8 %y, %x
1391  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1392  %r = select i1 %i, i8 %m, i8 %x
1393  ret i8 %r
1394}
1395
1396define i8 @eq_yx_umin_tval(i8 %x, i8 %y) {
1397; CHECK-LABEL: @eq_yx_umin_tval(
1398; CHECK-NEXT:    ret i8 [[X:%.*]]
1399;
1400  %i = icmp eq i8 %y, %x
1401  %m = call i8 @llvm.umin.i8(i8 %x, i8 %y)
1402  %r = select i1 %i, i8 %m, i8 %x
1403  ret i8 %r
1404}
1405
1406define i8 @ne_yx_umin_tval(i8 %x, i8 %y) {
1407; CHECK-LABEL: @ne_yx_umin_tval(
1408; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umin.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1409; CHECK-NEXT:    ret i8 [[M]]
1410;
1411  %i = icmp ne i8 %y, %x
1412  %m = call i8 @llvm.umin.i8(i8 %y, i8 %x)
1413  %r = select i1 %i, i8 %m, i8 %x
1414  ret i8 %r
1415}
1416
1417; umax
1418
1419define i8 @slt_xy_umax_fval(i8 %x, i8 %y) {
1420; CHECK-LABEL: @slt_xy_umax_fval(
1421; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
1422; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1423; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1424; CHECK-NEXT:    ret i8 [[R]]
1425;
1426  %i = icmp slt i8 %x, %y
1427  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1428  %r = select i1 %i, i8 %x, i8 %m
1429  ret i8 %r
1430}
1431
1432define i8 @sle_xy_umax_fval(i8 %x, i8 %y) {
1433; CHECK-LABEL: @sle_xy_umax_fval(
1434; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
1435; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1436; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1437; CHECK-NEXT:    ret i8 [[R]]
1438;
1439  %i = icmp sle i8 %x, %y
1440  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1441  %r = select i1 %i, i8 %x, i8 %m
1442  ret i8 %r
1443}
1444
1445define i8 @sgt_xy_umax_fval(i8 %x, i8 %y) {
1446; CHECK-LABEL: @sgt_xy_umax_fval(
1447; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
1448; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1449; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1450; CHECK-NEXT:    ret i8 [[R]]
1451;
1452  %i = icmp sgt i8 %x, %y
1453  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1454  %r = select i1 %i, i8 %x, i8 %m
1455  ret i8 %r
1456}
1457
1458define i8 @sge_xy_umax_fval(i8 %x, i8 %y) {
1459; CHECK-LABEL: @sge_xy_umax_fval(
1460; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
1461; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1462; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1463; CHECK-NEXT:    ret i8 [[R]]
1464;
1465  %i = icmp sge i8 %x, %y
1466  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1467  %r = select i1 %i, i8 %x, i8 %m
1468  ret i8 %r
1469}
1470
1471define i8 @ult_xy_umax_fval(i8 %x, i8 %y) {
1472; CHECK-LABEL: @ult_xy_umax_fval(
1473; CHECK-NEXT:    ret i8 [[X:%.*]]
1474;
1475  %i = icmp ult i8 %x, %y
1476  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1477  %r = select i1 %i, i8 %x, i8 %m
1478  ret i8 %r
1479}
1480
1481define i8 @ule_xy_umax_fval(i8 %x, i8 %y) {
1482; CHECK-LABEL: @ule_xy_umax_fval(
1483; CHECK-NEXT:    ret i8 [[X:%.*]]
1484;
1485  %i = icmp ule i8 %x, %y
1486  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1487  %r = select i1 %i, i8 %x, i8 %m
1488  ret i8 %r
1489}
1490
1491define i8 @ugt_xy_umax_fval(i8 %x, i8 %y) {
1492; CHECK-LABEL: @ugt_xy_umax_fval(
1493; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1494; CHECK-NEXT:    ret i8 [[M]]
1495;
1496  %i = icmp ugt i8 %x, %y
1497  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1498  %r = select i1 %i, i8 %x, i8 %m
1499  ret i8 %r
1500}
1501
1502define i8 @uge_xy_umax_fval(i8 %x, i8 %y) {
1503; CHECK-LABEL: @uge_xy_umax_fval(
1504; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1505; CHECK-NEXT:    ret i8 [[M]]
1506;
1507  %i = icmp uge i8 %x, %y
1508  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1509  %r = select i1 %i, i8 %x, i8 %m
1510  ret i8 %r
1511}
1512
1513define i8 @eq_xy_umax_fval(i8 %x, i8 %y) {
1514; CHECK-LABEL: @eq_xy_umax_fval(
1515; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1516; CHECK-NEXT:    ret i8 [[M]]
1517;
1518  %i = icmp eq i8 %x, %y
1519  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1520  %r = select i1 %i, i8 %x, i8 %m
1521  ret i8 %r
1522}
1523
1524define i8 @ne_xy_umax_fval(i8 %x, i8 %y) {
1525; CHECK-LABEL: @ne_xy_umax_fval(
1526; CHECK-NEXT:    ret i8 [[X:%.*]]
1527;
1528  %i = icmp ne i8 %x, %y
1529  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1530  %r = select i1 %i, i8 %x, i8 %m
1531  ret i8 %r
1532}
1533
1534; swap icmp operands
1535
1536define i8 @slt_yx_umax_fval(i8 %x, i8 %y) {
1537; CHECK-LABEL: @slt_yx_umax_fval(
1538; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
1539; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1540; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1541; CHECK-NEXT:    ret i8 [[R]]
1542;
1543  %i = icmp slt i8 %y, %x
1544  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1545  %r = select i1 %i, i8 %x, i8 %m
1546  ret i8 %r
1547}
1548
1549define i8 @sle_yx_umax_fval(i8 %x, i8 %y) {
1550; CHECK-LABEL: @sle_yx_umax_fval(
1551; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
1552; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1553; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1554; CHECK-NEXT:    ret i8 [[R]]
1555;
1556  %i = icmp sle i8 %y, %x
1557  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1558  %r = select i1 %i, i8 %x, i8 %m
1559  ret i8 %r
1560}
1561
1562define i8 @sgt_yx_umax_fval(i8 %x, i8 %y) {
1563; CHECK-LABEL: @sgt_yx_umax_fval(
1564; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
1565; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1566; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1567; CHECK-NEXT:    ret i8 [[R]]
1568;
1569  %i = icmp sgt i8 %y, %x
1570  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1571  %r = select i1 %i, i8 %x, i8 %m
1572  ret i8 %r
1573}
1574
1575define i8 @sge_yx_umax_fval(i8 %x, i8 %y) {
1576; CHECK-LABEL: @sge_yx_umax_fval(
1577; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
1578; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1579; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[X]], i8 [[M]]
1580; CHECK-NEXT:    ret i8 [[R]]
1581;
1582  %i = icmp sge i8 %y, %x
1583  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1584  %r = select i1 %i, i8 %x, i8 %m
1585  ret i8 %r
1586}
1587
1588define i8 @ult_yx_umax_fval(i8 %x, i8 %y) {
1589; CHECK-LABEL: @ult_yx_umax_fval(
1590; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1591; CHECK-NEXT:    ret i8 [[M]]
1592;
1593  %i = icmp ult i8 %y, %x
1594  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1595  %r = select i1 %i, i8 %x, i8 %m
1596  ret i8 %r
1597}
1598
1599define i8 @ule_yx_umax_fval(i8 %x, i8 %y) {
1600; CHECK-LABEL: @ule_yx_umax_fval(
1601; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1602; CHECK-NEXT:    ret i8 [[M]]
1603;
1604  %i = icmp ule i8 %y, %x
1605  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1606  %r = select i1 %i, i8 %x, i8 %m
1607  ret i8 %r
1608}
1609
1610define i8 @ugt_yx_umax_fval(i8 %x, i8 %y) {
1611; CHECK-LABEL: @ugt_yx_umax_fval(
1612; CHECK-NEXT:    ret i8 [[X:%.*]]
1613;
1614  %i = icmp ugt i8 %y, %x
1615  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1616  %r = select i1 %i, i8 %x, i8 %m
1617  ret i8 %r
1618}
1619
1620define i8 @uge_yx_umax_fval(i8 %x, i8 %y) {
1621; CHECK-LABEL: @uge_yx_umax_fval(
1622; CHECK-NEXT:    ret i8 [[X:%.*]]
1623;
1624  %i = icmp uge i8 %y, %x
1625  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1626  %r = select i1 %i, i8 %x, i8 %m
1627  ret i8 %r
1628}
1629
1630define i8 @eq_yx_umax_fval(i8 %x, i8 %y) {
1631; CHECK-LABEL: @eq_yx_umax_fval(
1632; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1633; CHECK-NEXT:    ret i8 [[M]]
1634;
1635  %i = icmp eq i8 %y, %x
1636  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1637  %r = select i1 %i, i8 %x, i8 %m
1638  ret i8 %r
1639}
1640
1641define i8 @ne_yx_umax_fval(i8 %x, i8 %y) {
1642; CHECK-LABEL: @ne_yx_umax_fval(
1643; CHECK-NEXT:    ret i8 [[X:%.*]]
1644;
1645  %i = icmp ne i8 %y, %x
1646  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1647  %r = select i1 %i, i8 %x, i8 %m
1648  ret i8 %r
1649}
1650
1651; swap select operands
1652
1653define i8 @slt_xy_umax_tval(i8 %x, i8 %y) {
1654; CHECK-LABEL: @slt_xy_umax_tval(
1655; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
1656; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1657; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1658; CHECK-NEXT:    ret i8 [[R]]
1659;
1660  %i = icmp slt i8 %x, %y
1661  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1662  %r = select i1 %i, i8 %m, i8 %x
1663  ret i8 %r
1664}
1665
1666define i8 @sle_xy_umax_tval(i8 %x, i8 %y) {
1667; CHECK-LABEL: @sle_xy_umax_tval(
1668; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
1669; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1670; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1671; CHECK-NEXT:    ret i8 [[R]]
1672;
1673  %i = icmp sle i8 %x, %y
1674  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1675  %r = select i1 %i, i8 %m, i8 %x
1676  ret i8 %r
1677}
1678
1679define i8 @sgt_xy_umax_tval(i8 %x, i8 %y) {
1680; CHECK-LABEL: @sgt_xy_umax_tval(
1681; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
1682; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1683; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1684; CHECK-NEXT:    ret i8 [[R]]
1685;
1686  %i = icmp sgt i8 %x, %y
1687  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1688  %r = select i1 %i, i8 %m, i8 %x
1689  ret i8 %r
1690}
1691
1692define i8 @sge_xy_umax_tval(i8 %x, i8 %y) {
1693; CHECK-LABEL: @sge_xy_umax_tval(
1694; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
1695; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1696; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1697; CHECK-NEXT:    ret i8 [[R]]
1698;
1699  %i = icmp sge i8 %x, %y
1700  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1701  %r = select i1 %i, i8 %m, i8 %x
1702  ret i8 %r
1703}
1704
1705define i8 @ult_xy_umax_tval(i8 %x, i8 %y) {
1706; CHECK-LABEL: @ult_xy_umax_tval(
1707; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1708; CHECK-NEXT:    ret i8 [[M]]
1709;
1710  %i = icmp ult i8 %x, %y
1711  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1712  %r = select i1 %i, i8 %m, i8 %x
1713  ret i8 %r
1714}
1715
1716define i8 @ule_xy_umax_tval(i8 %x, i8 %y) {
1717; CHECK-LABEL: @ule_xy_umax_tval(
1718; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1719; CHECK-NEXT:    ret i8 [[M]]
1720;
1721  %i = icmp ule i8 %x, %y
1722  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1723  %r = select i1 %i, i8 %m, i8 %x
1724  ret i8 %r
1725}
1726
1727define i8 @ugt_xy_umax_tval(i8 %x, i8 %y) {
1728; CHECK-LABEL: @ugt_xy_umax_tval(
1729; CHECK-NEXT:    ret i8 [[X:%.*]]
1730;
1731  %i = icmp ugt i8 %x, %y
1732  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1733  %r = select i1 %i, i8 %m, i8 %x
1734  ret i8 %r
1735}
1736
1737define i8 @uge_xy_umax_tval(i8 %x, i8 %y) {
1738; CHECK-LABEL: @uge_xy_umax_tval(
1739; CHECK-NEXT:    ret i8 [[X:%.*]]
1740;
1741  %i = icmp uge i8 %x, %y
1742  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1743  %r = select i1 %i, i8 %m, i8 %x
1744  ret i8 %r
1745}
1746
1747define i8 @eq_xy_umax_tval(i8 %x, i8 %y) {
1748; CHECK-LABEL: @eq_xy_umax_tval(
1749; CHECK-NEXT:    ret i8 [[X:%.*]]
1750;
1751  %i = icmp eq i8 %x, %y
1752  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1753  %r = select i1 %i, i8 %m, i8 %x
1754  ret i8 %r
1755}
1756
1757define i8 @ne_xy_umax_tval(i8 %x, i8 %y) {
1758; CHECK-LABEL: @ne_xy_umax_tval(
1759; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1760; CHECK-NEXT:    ret i8 [[M]]
1761;
1762  %i = icmp ne i8 %x, %y
1763  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1764  %r = select i1 %i, i8 %m, i8 %x
1765  ret i8 %r
1766}
1767
1768; swap icmp and select operands
1769
1770define i8 @slt_yx_umax_tval(i8 %x, i8 %y) {
1771; CHECK-LABEL: @slt_yx_umax_tval(
1772; CHECK-NEXT:    [[I:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
1773; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1774; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1775; CHECK-NEXT:    ret i8 [[R]]
1776;
1777  %i = icmp slt i8 %y, %x
1778  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1779  %r = select i1 %i, i8 %m, i8 %x
1780  ret i8 %r
1781}
1782
1783define i8 @sle_yx_umax_tval(i8 %x, i8 %y) {
1784; CHECK-LABEL: @sle_yx_umax_tval(
1785; CHECK-NEXT:    [[I:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
1786; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1787; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1788; CHECK-NEXT:    ret i8 [[R]]
1789;
1790  %i = icmp sle i8 %y, %x
1791  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1792  %r = select i1 %i, i8 %m, i8 %x
1793  ret i8 %r
1794}
1795
1796define i8 @sgt_yx_umax_tval(i8 %x, i8 %y) {
1797; CHECK-LABEL: @sgt_yx_umax_tval(
1798; CHECK-NEXT:    [[I:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
1799; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 [[Y]])
1800; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1801; CHECK-NEXT:    ret i8 [[R]]
1802;
1803  %i = icmp sgt i8 %y, %x
1804  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1805  %r = select i1 %i, i8 %m, i8 %x
1806  ret i8 %r
1807}
1808
1809define i8 @sge_yx_umax_tval(i8 %x, i8 %y) {
1810; CHECK-LABEL: @sge_yx_umax_tval(
1811; CHECK-NEXT:    [[I:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
1812; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
1813; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1814; CHECK-NEXT:    ret i8 [[R]]
1815;
1816  %i = icmp sge i8 %y, %x
1817  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1818  %r = select i1 %i, i8 %m, i8 %x
1819  ret i8 %r
1820}
1821
1822define i8 @ult_yx_umax_tval(i8 %x, i8 %y) {
1823; CHECK-LABEL: @ult_yx_umax_tval(
1824; CHECK-NEXT:    ret i8 [[X:%.*]]
1825;
1826  %i = icmp ult i8 %y, %x
1827  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1828  %r = select i1 %i, i8 %m, i8 %x
1829  ret i8 %r
1830}
1831
1832define i8 @ule_yx_umax_tval(i8 %x, i8 %y) {
1833; CHECK-LABEL: @ule_yx_umax_tval(
1834; CHECK-NEXT:    ret i8 [[X:%.*]]
1835;
1836  %i = icmp ule i8 %y, %x
1837  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1838  %r = select i1 %i, i8 %m, i8 %x
1839  ret i8 %r
1840}
1841
1842define i8 @ugt_yx_umax_tval(i8 %x, i8 %y) {
1843; CHECK-LABEL: @ugt_yx_umax_tval(
1844; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[X:%.*]], i8 [[Y:%.*]])
1845; CHECK-NEXT:    ret i8 [[M]]
1846;
1847  %i = icmp ugt i8 %y, %x
1848  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1849  %r = select i1 %i, i8 %m, i8 %x
1850  ret i8 %r
1851}
1852
1853define i8 @uge_yx_umax_tval(i8 %x, i8 %y) {
1854; CHECK-LABEL: @uge_yx_umax_tval(
1855; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1856; CHECK-NEXT:    ret i8 [[M]]
1857;
1858  %i = icmp uge i8 %y, %x
1859  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1860  %r = select i1 %i, i8 %m, i8 %x
1861  ret i8 %r
1862}
1863
1864define i8 @eq_yx_umax_tval(i8 %x, i8 %y) {
1865; CHECK-LABEL: @eq_yx_umax_tval(
1866; CHECK-NEXT:    ret i8 [[X:%.*]]
1867;
1868  %i = icmp eq i8 %y, %x
1869  %m = call i8 @llvm.umax.i8(i8 %x, i8 %y)
1870  %r = select i1 %i, i8 %m, i8 %x
1871  ret i8 %r
1872}
1873
1874define i8 @ne_yx_umax_tval(i8 %x, i8 %y) {
1875; CHECK-LABEL: @ne_yx_umax_tval(
1876; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y:%.*]], i8 [[X:%.*]])
1877; CHECK-NEXT:    ret i8 [[M]]
1878;
1879  %i = icmp ne i8 %y, %x
1880  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1881  %r = select i1 %i, i8 %m, i8 %x
1882  ret i8 %r
1883}
1884
1885; negative test - wrong cmp op
1886
1887define i8 @ne_yz_umax_tval(i8 %x, i8 %y, i8 %z) {
1888; CHECK-LABEL: @ne_yz_umax_tval(
1889; CHECK-NEXT:    [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[Z:%.*]]
1890; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X:%.*]])
1891; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1892; CHECK-NEXT:    ret i8 [[R]]
1893;
1894  %i = icmp ne i8 %y, %z
1895  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1896  %r = select i1 %i, i8 %m, i8 %x
1897  ret i8 %r
1898}
1899
1900; negative test - wrong max op
1901
1902define i8 @ne_yx_umax_tval_wrong_op(i8 %x, i8 %y, i8 %z) {
1903; CHECK-LABEL: @ne_yx_umax_tval_wrong_op(
1904; CHECK-NEXT:    [[I:%.*]] = icmp ne i8 [[Y:%.*]], [[X:%.*]]
1905; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Z:%.*]], i8 [[X]])
1906; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1907; CHECK-NEXT:    ret i8 [[R]]
1908;
1909  %i = icmp ne i8 %y, %x
1910  %m = call i8 @llvm.umax.i8(i8 %z, i8 %x)
1911  %r = select i1 %i, i8 %m, i8 %x
1912  ret i8 %r
1913}
1914
1915; negative test - wrong cmp op
1916
1917define i8 @eq_yz_umax_tval(i8 %x, i8 %y, i8 %z) {
1918; CHECK-LABEL: @eq_yz_umax_tval(
1919; CHECK-NEXT:    [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[Z:%.*]]
1920; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X:%.*]])
1921; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1922; CHECK-NEXT:    ret i8 [[R]]
1923;
1924  %i = icmp eq i8 %y, %z
1925  %m = call i8 @llvm.umax.i8(i8 %y, i8 %x)
1926  %r = select i1 %i, i8 %m, i8 %x
1927  ret i8 %r
1928}
1929
1930; negative test - wrong max op
1931
1932define i8 @eq_yx_umax_tval_wrong_op(i8 %x, i8 %y, i8 %z) {
1933; CHECK-LABEL: @eq_yx_umax_tval_wrong_op(
1934; CHECK-NEXT:    [[I:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]
1935; CHECK-NEXT:    [[M:%.*]] = call i8 @llvm.umax.i8(i8 [[Z:%.*]], i8 [[X]])
1936; CHECK-NEXT:    [[R:%.*]] = select i1 [[I]], i8 [[M]], i8 [[X]]
1937; CHECK-NEXT:    ret i8 [[R]]
1938;
1939  %i = icmp eq i8 %y, %x
1940  %m = call i8 @llvm.umax.i8(i8 %z, i8 %x)
1941  %r = select i1 %i, i8 %m, i8 %x
1942  ret i8 %r
1943}
1944
1945; select with smin pred
1946
1947define <4 x i8> @slt_xy_smin_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
1948; CHECK-LABEL: @slt_xy_smin_select_y_shuf_fval(
1949; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.smin.v4i8(<4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]])
1950; CHECK-NEXT:    ret <4 x i8> [[M]]
1951;
1952  %i = icmp slt <4 x i8> %x, %y
1953  %m = call <4 x i8> @llvm.smin.v4i8(<4 x i8> %x, <4 x i8> %y)
1954  %s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1955  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
1956  ret <4 x i8> %r
1957}
1958
1959; negative test - wrong pred
1960
1961define <4 x i8> @sgt_xy_smin_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
1962; CHECK-LABEL: @sgt_xy_smin_select_y_shuf_fval(
1963; CHECK-NEXT:    [[I:%.*]] = icmp sgt <4 x i8> [[X:%.*]], [[Y:%.*]]
1964; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.smin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
1965; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1966; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
1967; CHECK-NEXT:    ret <4 x i8> [[R]]
1968;
1969  %i = icmp sgt <4 x i8> %x, %y
1970  %m = call <4 x i8> @llvm.smin.v4i8(<4 x i8> %x, <4 x i8> %y)
1971  %s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1972  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
1973  ret <4 x i8> %r
1974}
1975
1976; negative test - wrong shuffle op
1977
1978define <4 x i8> @slt_xy_smin_select_x_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
1979; CHECK-LABEL: @slt_xy_smin_select_x_shuf_fval(
1980; CHECK-NEXT:    [[I:%.*]] = icmp slt <4 x i8> [[X:%.*]], [[Y:%.*]]
1981; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.smin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
1982; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[M]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1983; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
1984; CHECK-NEXT:    ret <4 x i8> [[R]]
1985;
1986  %i = icmp slt <4 x i8> %x, %y
1987  %m = call <4 x i8> @llvm.smin.v4i8(<4 x i8> %x, <4 x i8> %y)
1988  %s = shufflevector <4 x i8> %x, <4 x i8> %m, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1989  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
1990  ret <4 x i8> %r
1991}
1992
1993; select with non-strict smax pred
1994
1995define <4 x i8> @sge_xy_smax_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
1996; CHECK-LABEL: @sge_xy_smax_select_y_shuf_fval(
1997; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.smax.v4i8(<4 x i8> [[Y:%.*]], <4 x i8> [[X:%.*]])
1998; CHECK-NEXT:    ret <4 x i8> [[M]]
1999;
2000  %i = icmp sge <4 x i8> %x, %y
2001  %m = call <4 x i8> @llvm.smax.v4i8(<4 x i8> %y, <4 x i8> %x)
2002  %s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
2003  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
2004  ret <4 x i8> %r
2005}
2006
2007; negative test - wrong (swapped) pred
2008
2009define <4 x i8> @sle_yx_smax_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
2010; CHECK-LABEL: @sle_yx_smax_select_y_shuf_fval(
2011; CHECK-NEXT:    [[I:%.*]] = icmp sge <4 x i8> [[Y:%.*]], [[X:%.*]]
2012; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.smax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
2013; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 4, i32 1, i32 6, i32 3>
2014; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
2015; CHECK-NEXT:    ret <4 x i8> [[R]]
2016;
2017  %i = icmp sge <4 x i8> %y, %x
2018  %m = call <4 x i8> @llvm.smax.v4i8(<4 x i8> %y, <4 x i8> %x)
2019  %s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
2020  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
2021  ret <4 x i8> %r
2022}
2023
2024; negative test - wrong shuffle op
2025
2026define <4 x i8> @sge_xy_smax_select_x_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
2027; CHECK-LABEL: @sge_xy_smax_select_x_shuf_fval(
2028; CHECK-NEXT:    [[I:%.*]] = icmp sge <4 x i8> [[X:%.*]], [[Y:%.*]]
2029; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.smax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
2030; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[M]], <4 x i32> <i32 4, i32 1, i32 6, i32 3>
2031; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
2032; CHECK-NEXT:    ret <4 x i8> [[R]]
2033;
2034  %i = icmp sge <4 x i8> %x, %y
2035  %m = call <4 x i8> @llvm.smax.v4i8(<4 x i8> %y, <4 x i8> %x)
2036  %s = shufflevector <4 x i8> %x, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
2037  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
2038  ret <4 x i8> %r
2039}
2040
2041; select with non-strict inverted umin pred
2042
2043define <4 x i8> @uge_xy_umin_select_y_shuf_tval(<4 x i8> %x, <4 x i8> %y) {
2044; CHECK-LABEL: @uge_xy_umin_select_y_shuf_tval(
2045; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.umin.v4i8(<4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]])
2046; CHECK-NEXT:    ret <4 x i8> [[M]]
2047;
2048  %i = icmp uge <4 x i8> %x, %y
2049  %m = call <4 x i8> @llvm.umin.v4i8(<4 x i8> %x, <4 x i8> %y)
2050  %s = shufflevector <4 x i8> %m, <4 x i8> %y, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
2051  %r = select <4 x i1> %i, <4 x i8> %s, <4 x i8> %x
2052  ret <4 x i8> %r
2053}
2054
2055; negative test - wrong pred
2056
2057define <4 x i8> @uge_xy_umin_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
2058; CHECK-LABEL: @uge_xy_umin_select_y_shuf_fval(
2059; CHECK-NEXT:    [[I:%.*]] = icmp uge <4 x i8> [[X:%.*]], [[Y:%.*]]
2060; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.umin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
2061; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[M]], <4 x i8> [[Y]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>
2062; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
2063; CHECK-NEXT:    ret <4 x i8> [[R]]
2064;
2065  %i = icmp uge <4 x i8> %x, %y
2066  %m = call <4 x i8> @llvm.umin.v4i8(<4 x i8> %x, <4 x i8> %y)
2067  %s = shufflevector <4 x i8> %m, <4 x i8> %y, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
2068  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
2069  ret <4 x i8> %r
2070}
2071
2072; negative test - wrong shuffle op
2073
2074define <4 x i8> @uge_xy_umin_select_x_shuf_tval(<4 x i8> %x, <4 x i8> %y) {
2075; CHECK-LABEL: @uge_xy_umin_select_x_shuf_tval(
2076; CHECK-NEXT:    [[I:%.*]] = icmp uge <4 x i8> [[X:%.*]], [[Y:%.*]]
2077; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.umin.v4i8(<4 x i8> [[X]], <4 x i8> [[Y]])
2078; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[M]], <4 x i8> [[X]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>
2079; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[S]], <4 x i8> [[X]]
2080; CHECK-NEXT:    ret <4 x i8> [[R]]
2081;
2082  %i = icmp uge <4 x i8> %x, %y
2083  %m = call <4 x i8> @llvm.umin.v4i8(<4 x i8> %x, <4 x i8> %y)
2084  %s = shufflevector <4 x i8> %m, <4 x i8> %x, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
2085  %r = select <4 x i1> %i, <4 x i8> %s, <4 x i8> %x
2086  ret <4 x i8> %r
2087}
2088
2089; select with swapped umax pred
2090
2091define <4 x i8> @ult_yx_umax_select_y_shuf_fval(<4 x i8> %x, <4 x i8> %y) {
2092; CHECK-LABEL: @ult_yx_umax_select_y_shuf_fval(
2093; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.umax.v4i8(<4 x i8> [[Y:%.*]], <4 x i8> [[X:%.*]])
2094; CHECK-NEXT:    ret <4 x i8> [[M]]
2095;
2096  %i = icmp ult <4 x i8> %y, %x
2097  %m = call <4 x i8> @llvm.umax.v4i8(<4 x i8> %y, <4 x i8> %x)
2098  %s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
2099  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
2100  ret <4 x i8> %r
2101}
2102
2103; negative test - wrong (inverted+swapped) pred
2104
2105define <4 x i8> @ult_yx_umax_select_y_shuf_tval(<4 x i8> %x, <4 x i8> %y) {
2106; CHECK-LABEL: @ult_yx_umax_select_y_shuf_tval(
2107; CHECK-NEXT:    [[I:%.*]] = icmp ult <4 x i8> [[Y:%.*]], [[X:%.*]]
2108; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.umax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
2109; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>
2110; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[S]], <4 x i8> [[X]]
2111; CHECK-NEXT:    ret <4 x i8> [[R]]
2112;
2113  %i = icmp ult <4 x i8> %y, %x
2114  %m = call <4 x i8> @llvm.umax.v4i8(<4 x i8> %y, <4 x i8> %x)
2115  %s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
2116  %r = select <4 x i1> %i, <4 x i8> %s, <4 x i8> %x
2117  ret <4 x i8> %r
2118}
2119
2120; negative test - wrong shuffle mask
2121
2122define <4 x i8> @ult_yx_umax_select_y_shuf_mask_fval(<4 x i8> %x, <4 x i8> %y) {
2123; CHECK-LABEL: @ult_yx_umax_select_y_shuf_mask_fval(
2124; CHECK-NEXT:    [[I:%.*]] = icmp ult <4 x i8> [[Y:%.*]], [[X:%.*]]
2125; CHECK-NEXT:    [[M:%.*]] = call <4 x i8> @llvm.umax.v4i8(<4 x i8> [[Y]], <4 x i8> [[X]])
2126; CHECK-NEXT:    [[S:%.*]] = shufflevector <4 x i8> [[Y]], <4 x i8> [[M]], <4 x i32> <i32 5, i32 1, i32 2, i32 3>
2127; CHECK-NEXT:    [[R:%.*]] = select <4 x i1> [[I]], <4 x i8> [[X]], <4 x i8> [[S]]
2128; CHECK-NEXT:    ret <4 x i8> [[R]]
2129;
2130  %i = icmp ult <4 x i8> %y, %x
2131  %m = call <4 x i8> @llvm.umax.v4i8(<4 x i8> %y, <4 x i8> %x)
2132  %s = shufflevector <4 x i8> %y, <4 x i8> %m, <4 x i32> <i32 5, i32 1, i32 2, i32 3>
2133  %r = select <4 x i1> %i, <4 x i8> %x, <4 x i8> %s
2134  ret <4 x i8> %r
2135}
2136
2137define i8 @select_umin_with_icmp_zero(i8 %x, i8 %y) {
2138; CHECK-LABEL: @select_umin_with_icmp_zero(
2139; CHECK-NEXT:    ret i8 0
2140;
2141  %min = call i8 @llvm.umin.i8(i8 %x, i8 %y)
2142  %cmp = icmp eq i8 %x, 0
2143  %sel = select i1 %cmp, i8 %min, i8 0
2144  ret i8 %sel
2145}
2146