xref: /llvm-project/llvm/test/Transforms/InstCombine/smin-icmp.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3
4; If we have an smin feeding a signed or equality icmp that shares an
5; operand with the smin, the compare should always be folded.
6; Test all 6 foldable predicates (eq,ne,sge,sgt,sle,slt) * 4 commutation
7; possibilities for each predicate. Note that folds to true/false or
8; folds to an existing instruction may be handled by InstSimplify.
9
10; smin(X, Y) == X --> X <= Y
11
12define i1 @eq_smin1(i32 %x, i32 %y) {
13; CHECK-LABEL: @eq_smin1(
14; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]]
15; CHECK-NEXT:    ret i1 [[CMP2]]
16;
17  %cmp1 = icmp slt i32 %x, %y
18  %sel = select i1 %cmp1, i32 %x, i32 %y
19  %cmp2 = icmp eq i32 %sel, %x
20  ret i1 %cmp2
21}
22
23; Commute min operands.
24
25define i1 @eq_smin2(i32 %x, i32 %y) {
26; CHECK-LABEL: @eq_smin2(
27; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]]
28; CHECK-NEXT:    ret i1 [[CMP2]]
29;
30  %cmp1 = icmp slt i32 %y, %x
31  %sel = select i1 %cmp1, i32 %y, i32 %x
32  %cmp2 = icmp eq i32 %sel, %x
33  ret i1 %cmp2
34}
35
36; Disguise the icmp predicate by commuting the min op to the RHS.
37
38define i1 @eq_smin3(i32 %a, i32 %y) {
39; CHECK-LABEL: @eq_smin3(
40; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
41; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X]], [[Y:%.*]]
42; CHECK-NEXT:    ret i1 [[CMP2]]
43;
44  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
45  %cmp1 = icmp slt i32 %x, %y
46  %sel = select i1 %cmp1, i32 %x, i32 %y
47  %cmp2 = icmp eq i32 %x, %sel
48  ret i1 %cmp2
49}
50
51; Commute min operands.
52
53define i1 @eq_smin4(i32 %a, i32 %y) {
54; CHECK-LABEL: @eq_smin4(
55; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
56; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X]], [[Y:%.*]]
57; CHECK-NEXT:    ret i1 [[CMP2]]
58;
59  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
60  %cmp1 = icmp slt i32 %y, %x
61  %sel = select i1 %cmp1, i32 %y, i32 %x
62  %cmp2 = icmp eq i32 %x, %sel
63  ret i1 %cmp2
64}
65
66; smin(X, Y) >= X --> Y >= X
67
68define i1 @sge_smin1(i32 %x, i32 %y) {
69; CHECK-LABEL: @sge_smin1(
70; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X:%.*]]
71; CHECK-NEXT:    ret i1 [[CMP2]]
72;
73  %cmp1 = icmp slt i32 %x, %y
74  %sel = select i1 %cmp1, i32 %x, i32 %y
75  %cmp2 = icmp sge i32 %sel, %x
76  ret i1 %cmp2
77}
78
79; Commute min operands.
80
81define i1 @sge_smin2(i32 %x, i32 %y) {
82; CHECK-LABEL: @sge_smin2(
83; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X:%.*]]
84; CHECK-NEXT:    ret i1 [[CMP2]]
85;
86  %cmp1 = icmp slt i32 %y, %x
87  %sel = select i1 %cmp1, i32 %y, i32 %x
88  %cmp2 = icmp sge i32 %sel, %x
89  ret i1 %cmp2
90}
91
92; Disguise the icmp predicate by commuting the min op to the RHS.
93
94define i1 @sge_smin3(i32 %a, i32 %y) {
95; CHECK-LABEL: @sge_smin3(
96; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
97; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X]]
98; CHECK-NEXT:    ret i1 [[CMP2]]
99;
100  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
101  %cmp1 = icmp slt i32 %x, %y
102  %sel = select i1 %cmp1, i32 %x, i32 %y
103  %cmp2 = icmp sle i32 %x, %sel
104  ret i1 %cmp2
105}
106
107; Commute min operands.
108
109define i1 @sge_smin4(i32 %a, i32 %y) {
110; CHECK-LABEL: @sge_smin4(
111; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
112; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[Y:%.*]], [[X]]
113; CHECK-NEXT:    ret i1 [[CMP2]]
114;
115  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
116  %cmp1 = icmp slt i32 %y, %x
117  %sel = select i1 %cmp1, i32 %y, i32 %x
118  %cmp2 = icmp sle i32 %x, %sel
119  ret i1 %cmp2
120}
121
122; smin(X, Y) != X --> X > Y
123
124define i1 @ne_smin1(i32 %x, i32 %y) {
125; CHECK-LABEL: @ne_smin1(
126; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
127; CHECK-NEXT:    ret i1 [[CMP2]]
128;
129  %cmp1 = icmp slt i32 %x, %y
130  %sel = select i1 %cmp1, i32 %x, i32 %y
131  %cmp2 = icmp ne i32 %sel, %x
132  ret i1 %cmp2
133}
134
135; Commute min operands.
136
137define i1 @ne_smin2(i32 %x, i32 %y) {
138; CHECK-LABEL: @ne_smin2(
139; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
140; CHECK-NEXT:    ret i1 [[CMP2]]
141;
142  %cmp1 = icmp slt i32 %y, %x
143  %sel = select i1 %cmp1, i32 %y, i32 %x
144  %cmp2 = icmp ne i32 %sel, %x
145  ret i1 %cmp2
146}
147
148; Disguise the icmp predicate by commuting the min op to the RHS.
149
150define i1 @ne_smin3(i32 %a, i32 %y) {
151; CHECK-LABEL: @ne_smin3(
152; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
153; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X]], [[Y:%.*]]
154; CHECK-NEXT:    ret i1 [[CMP2]]
155;
156  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
157  %cmp1 = icmp slt i32 %x, %y
158  %sel = select i1 %cmp1, i32 %x, i32 %y
159  %cmp2 = icmp ne i32 %x, %sel
160  ret i1 %cmp2
161}
162
163; Commute min operands.
164
165define i1 @ne_smin4(i32 %a, i32 %y) {
166; CHECK-LABEL: @ne_smin4(
167; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
168; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[X]], [[Y:%.*]]
169; CHECK-NEXT:    ret i1 [[CMP2]]
170;
171  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
172  %cmp1 = icmp slt i32 %y, %x
173  %sel = select i1 %cmp1, i32 %y, i32 %x
174  %cmp2 = icmp ne i32 %x, %sel
175  ret i1 %cmp2
176}
177
178; smin(X, Y) < X --> Y < X
179
180define i1 @slt_smin1(i32 %x, i32 %y) {
181; CHECK-LABEL: @slt_smin1(
182; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]]
183; CHECK-NEXT:    ret i1 [[CMP2]]
184;
185  %cmp1 = icmp slt i32 %x, %y
186  %sel = select i1 %cmp1, i32 %x, i32 %y
187  %cmp2 = icmp slt i32 %sel, %x
188  ret i1 %cmp2
189}
190
191; Commute min operands.
192
193define i1 @slt_smin2(i32 %x, i32 %y) {
194; CHECK-LABEL: @slt_smin2(
195; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X:%.*]]
196; CHECK-NEXT:    ret i1 [[CMP2]]
197;
198  %cmp1 = icmp slt i32 %y, %x
199  %sel = select i1 %cmp1, i32 %y, i32 %x
200  %cmp2 = icmp slt i32 %sel, %x
201  ret i1 %cmp2
202}
203
204; Disguise the icmp predicate by commuting the min op to the RHS.
205
206define i1 @slt_smin3(i32 %a, i32 %y) {
207; CHECK-LABEL: @slt_smin3(
208; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
209; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X]]
210; CHECK-NEXT:    ret i1 [[CMP2]]
211;
212  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
213  %cmp1 = icmp slt i32 %x, %y
214  %sel = select i1 %cmp1, i32 %x, i32 %y
215  %cmp2 = icmp sgt i32 %x, %sel
216  ret i1 %cmp2
217}
218
219; Commute min operands.
220
221define i1 @slt_smin4(i32 %a, i32 %y) {
222; CHECK-LABEL: @slt_smin4(
223; CHECK-NEXT:    [[X:%.*]] = add i32 [[A:%.*]], 3
224; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[Y:%.*]], [[X]]
225; CHECK-NEXT:    ret i1 [[CMP2]]
226;
227  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
228  %cmp1 = icmp slt i32 %y, %x
229  %sel = select i1 %cmp1, i32 %y, i32 %x
230  %cmp2 = icmp sgt i32 %x, %sel
231  ret i1 %cmp2
232}
233
234; smin(X, Y) <= X --> true
235
236define i1 @sle_smin1(i32 %x, i32 %y) {
237; CHECK-LABEL: @sle_smin1(
238; CHECK-NEXT:    ret i1 true
239;
240  %cmp1 = icmp slt i32 %x, %y
241  %sel = select i1 %cmp1, i32 %x, i32 %y
242  %cmp2 = icmp sle i32 %sel, %x
243  ret i1 %cmp2
244}
245
246; Commute min operands.
247
248define i1 @sle_smin2(i32 %x, i32 %y) {
249; CHECK-LABEL: @sle_smin2(
250; CHECK-NEXT:    ret i1 true
251;
252  %cmp1 = icmp slt i32 %y, %x
253  %sel = select i1 %cmp1, i32 %y, i32 %x
254  %cmp2 = icmp sle i32 %sel, %x
255  ret i1 %cmp2
256}
257
258; Disguise the icmp predicate by commuting the min op to the RHS.
259
260define i1 @sle_smin3(i32 %a, i32 %y) {
261; CHECK-LABEL: @sle_smin3(
262; CHECK-NEXT:    ret i1 true
263;
264  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
265  %cmp1 = icmp slt i32 %x, %y
266  %sel = select i1 %cmp1, i32 %x, i32 %y
267  %cmp2 = icmp sge i32 %x, %sel
268  ret i1 %cmp2
269}
270
271; Commute min operands.
272
273define i1 @sle_smin4(i32 %a, i32 %y) {
274; CHECK-LABEL: @sle_smin4(
275; CHECK-NEXT:    ret i1 true
276;
277  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
278  %cmp1 = icmp slt i32 %y, %x
279  %sel = select i1 %cmp1, i32 %y, i32 %x
280  %cmp2 = icmp sge i32 %x, %sel
281  ret i1 %cmp2
282}
283
284; smin(X, Y) > X --> false
285
286define i1 @sgt_smin1(i32 %x, i32 %y) {
287; CHECK-LABEL: @sgt_smin1(
288; CHECK-NEXT:    ret i1 false
289;
290  %cmp1 = icmp slt i32 %x, %y
291  %sel = select i1 %cmp1, i32 %x, i32 %y
292  %cmp2 = icmp sgt i32 %sel, %x
293  ret i1 %cmp2
294}
295
296; Commute min operands.
297
298define i1 @sgt_smin2(i32 %x, i32 %y) {
299; CHECK-LABEL: @sgt_smin2(
300; CHECK-NEXT:    ret i1 false
301;
302  %cmp1 = icmp slt i32 %y, %x
303  %sel = select i1 %cmp1, i32 %y, i32 %x
304  %cmp2 = icmp sgt i32 %sel, %x
305  ret i1 %cmp2
306}
307
308; Disguise the icmp predicate by commuting the min op to the RHS.
309
310define i1 @sgt_smin3(i32 %a, i32 %y) {
311; CHECK-LABEL: @sgt_smin3(
312; CHECK-NEXT:    ret i1 false
313;
314  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
315  %cmp1 = icmp slt i32 %x, %y
316  %sel = select i1 %cmp1, i32 %x, i32 %y
317  %cmp2 = icmp slt i32 %x, %sel
318  ret i1 %cmp2
319}
320
321; Commute min operands.
322
323define i1 @sgt_smin4(i32 %a, i32 %y) {
324; CHECK-LABEL: @sgt_smin4(
325; CHECK-NEXT:    ret i1 false
326;
327  %x = add i32 %a, 3 ; thwart complexity-based canonicalization
328  %cmp1 = icmp slt i32 %y, %x
329  %sel = select i1 %cmp1, i32 %y, i32 %x
330  %cmp2 = icmp slt i32 %x, %sel
331  ret i1 %cmp2
332}
333
334declare void @use(i1 %c)
335
336define void @eq_smin_contextual(i32 %x, i32 %y, i32 %z) {
337; CHECK-LABEL: @eq_smin_contextual(
338; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
339; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
340; CHECK:       if:
341; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])
342; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]
343; CHECK-NEXT:    call void @use(i1 [[CMP1]])
344; CHECK-NEXT:    call void @use(i1 true)
345; CHECK-NEXT:    call void @use(i1 false)
346; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]
347; CHECK-NEXT:    call void @use(i1 [[CMP4]])
348; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
349; CHECK-NEXT:    call void @use(i1 [[CMP5]])
350; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
351; CHECK-NEXT:    call void @use(i1 [[CMP6]])
352; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
353; CHECK-NEXT:    call void @use(i1 [[CMP7]])
354; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
355; CHECK-NEXT:    call void @use(i1 [[CMP8]])
356; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[X]], [[Y]]
357; CHECK-NEXT:    call void @use(i1 [[CMP9]])
358; CHECK-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[X]], [[Y]]
359; CHECK-NEXT:    call void @use(i1 [[CMP10]])
360; CHECK-NEXT:    ret void
361; CHECK:       end:
362; CHECK-NEXT:    ret void
363;
364  %cmp = icmp eq i32 %x, %z
365  br i1 %cmp, label %if, label %end
366if:
367  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)
368  %cmp1 = icmp slt i32 %cond, %z
369  call void @use(i1 %cmp1)
370  %cmp2 = icmp sle i32 %cond, %z
371  call void @use(i1 %cmp2)
372  %cmp3 = icmp sgt i32 %cond, %z
373  call void @use(i1 %cmp3)
374  %cmp4 = icmp sge i32 %cond, %z
375  call void @use(i1 %cmp4)
376  %cmp5 = icmp ult i32 %cond, %z
377  call void @use(i1 %cmp5)
378  %cmp6 = icmp ule i32 %cond, %z
379  call void @use(i1 %cmp6)
380  %cmp7 = icmp ugt i32 %cond, %z
381  call void @use(i1 %cmp7)
382  %cmp8 = icmp uge i32 %cond, %z
383  call void @use(i1 %cmp8)
384  %cmp9 = icmp eq i32 %cond, %z
385  call void @use(i1 %cmp9)
386  %cmp10 = icmp ne i32 %cond, %z
387  call void @use(i1 %cmp10)
388  ret void
389end:
390  ret void
391}
392
393define void @eq_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
394; CHECK-LABEL: @eq_smin_contextual_commuted(
395; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
396; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
397; CHECK:       if:
398; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])
399; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]
400; CHECK-NEXT:    call void @use(i1 [[CMP1]])
401; CHECK-NEXT:    call void @use(i1 true)
402; CHECK-NEXT:    call void @use(i1 false)
403; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]
404; CHECK-NEXT:    call void @use(i1 [[CMP4]])
405; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
406; CHECK-NEXT:    call void @use(i1 [[CMP5]])
407; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
408; CHECK-NEXT:    call void @use(i1 [[CMP6]])
409; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
410; CHECK-NEXT:    call void @use(i1 [[CMP7]])
411; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
412; CHECK-NEXT:    call void @use(i1 [[CMP8]])
413; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[X]], [[Y]]
414; CHECK-NEXT:    call void @use(i1 [[CMP9]])
415; CHECK-NEXT:    [[CMP10:%.*]] = icmp sgt i32 [[X]], [[Y]]
416; CHECK-NEXT:    call void @use(i1 [[CMP10]])
417; CHECK-NEXT:    ret void
418; CHECK:       end:
419; CHECK-NEXT:    ret void
420;
421  %cmp = icmp eq i32 %x, %z
422  br i1 %cmp, label %if, label %end
423if:
424  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)
425  %cmp1 = icmp slt i32 %cond, %z
426  call void @use(i1 %cmp1)
427  %cmp2 = icmp sle i32 %cond, %z
428  call void @use(i1 %cmp2)
429  %cmp3 = icmp sgt i32 %cond, %z
430  call void @use(i1 %cmp3)
431  %cmp4 = icmp sge i32 %cond, %z
432  call void @use(i1 %cmp4)
433  %cmp5 = icmp ult i32 %cond, %z
434  call void @use(i1 %cmp5)
435  %cmp6 = icmp ule i32 %cond, %z
436  call void @use(i1 %cmp6)
437  %cmp7 = icmp ugt i32 %cond, %z
438  call void @use(i1 %cmp7)
439  %cmp8 = icmp uge i32 %cond, %z
440  call void @use(i1 %cmp8)
441  %cmp9 = icmp eq i32 %cond, %z
442  call void @use(i1 %cmp9)
443  %cmp10 = icmp ne i32 %cond, %z
444  call void @use(i1 %cmp10)
445  ret void
446end:
447  ret void
448}
449
450define void @slt_smin_contextual(i32 %x, i32 %y, i32 %z) {
451; CHECK-LABEL: @slt_smin_contextual(
452; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]
453; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
454; CHECK:       if:
455; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])
456; CHECK-NEXT:    call void @use(i1 true)
457; CHECK-NEXT:    call void @use(i1 true)
458; CHECK-NEXT:    call void @use(i1 false)
459; CHECK-NEXT:    call void @use(i1 false)
460; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
461; CHECK-NEXT:    call void @use(i1 [[CMP5]])
462; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
463; CHECK-NEXT:    call void @use(i1 [[CMP6]])
464; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
465; CHECK-NEXT:    call void @use(i1 [[CMP7]])
466; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
467; CHECK-NEXT:    call void @use(i1 [[CMP8]])
468; CHECK-NEXT:    call void @use(i1 false)
469; CHECK-NEXT:    call void @use(i1 true)
470; CHECK-NEXT:    ret void
471; CHECK:       end:
472; CHECK-NEXT:    ret void
473;
474  %cmp = icmp slt i32 %x, %z
475  br i1 %cmp, label %if, label %end
476if:
477  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)
478  %cmp1 = icmp slt i32 %cond, %z
479  call void @use(i1 %cmp1)
480  %cmp2 = icmp sle i32 %cond, %z
481  call void @use(i1 %cmp2)
482  %cmp3 = icmp sgt i32 %cond, %z
483  call void @use(i1 %cmp3)
484  %cmp4 = icmp sge i32 %cond, %z
485  call void @use(i1 %cmp4)
486  %cmp5 = icmp ult i32 %cond, %z
487  call void @use(i1 %cmp5)
488  %cmp6 = icmp ule i32 %cond, %z
489  call void @use(i1 %cmp6)
490  %cmp7 = icmp ugt i32 %cond, %z
491  call void @use(i1 %cmp7)
492  %cmp8 = icmp uge i32 %cond, %z
493  call void @use(i1 %cmp8)
494  %cmp9 = icmp eq i32 %cond, %z
495  call void @use(i1 %cmp9)
496  %cmp10 = icmp ne i32 %cond, %z
497  call void @use(i1 %cmp10)
498  ret void
499end:
500  ret void
501}
502
503define void @slt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
504; CHECK-LABEL: @slt_smin_contextual_commuted(
505; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]
506; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
507; CHECK:       if:
508; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])
509; CHECK-NEXT:    call void @use(i1 true)
510; CHECK-NEXT:    call void @use(i1 true)
511; CHECK-NEXT:    call void @use(i1 false)
512; CHECK-NEXT:    call void @use(i1 false)
513; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
514; CHECK-NEXT:    call void @use(i1 [[CMP5]])
515; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
516; CHECK-NEXT:    call void @use(i1 [[CMP6]])
517; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
518; CHECK-NEXT:    call void @use(i1 [[CMP7]])
519; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
520; CHECK-NEXT:    call void @use(i1 [[CMP8]])
521; CHECK-NEXT:    call void @use(i1 false)
522; CHECK-NEXT:    call void @use(i1 true)
523; CHECK-NEXT:    ret void
524; CHECK:       end:
525; CHECK-NEXT:    ret void
526;
527  %cmp = icmp slt i32 %x, %z
528  br i1 %cmp, label %if, label %end
529if:
530  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)
531  %cmp1 = icmp slt i32 %cond, %z
532  call void @use(i1 %cmp1)
533  %cmp2 = icmp sle i32 %cond, %z
534  call void @use(i1 %cmp2)
535  %cmp3 = icmp sgt i32 %cond, %z
536  call void @use(i1 %cmp3)
537  %cmp4 = icmp sge i32 %cond, %z
538  call void @use(i1 %cmp4)
539  %cmp5 = icmp ult i32 %cond, %z
540  call void @use(i1 %cmp5)
541  %cmp6 = icmp ule i32 %cond, %z
542  call void @use(i1 %cmp6)
543  %cmp7 = icmp ugt i32 %cond, %z
544  call void @use(i1 %cmp7)
545  %cmp8 = icmp uge i32 %cond, %z
546  call void @use(i1 %cmp8)
547  %cmp9 = icmp eq i32 %cond, %z
548  call void @use(i1 %cmp9)
549  %cmp10 = icmp ne i32 %cond, %z
550  call void @use(i1 %cmp10)
551  ret void
552end:
553  ret void
554}
555
556define void @sle_smin_contextual(i32 %x, i32 %y, i32 %z) {
557; CHECK-LABEL: @sle_smin_contextual(
558; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]
559; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]
560; CHECK:       if:
561; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])
562; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[COND]], [[Z]]
563; CHECK-NEXT:    call void @use(i1 [[CMP1]])
564; CHECK-NEXT:    call void @use(i1 true)
565; CHECK-NEXT:    call void @use(i1 false)
566; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[COND]], [[Z]]
567; CHECK-NEXT:    call void @use(i1 [[CMP4]])
568; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
569; CHECK-NEXT:    call void @use(i1 [[CMP5]])
570; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
571; CHECK-NEXT:    call void @use(i1 [[CMP6]])
572; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
573; CHECK-NEXT:    call void @use(i1 [[CMP7]])
574; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
575; CHECK-NEXT:    call void @use(i1 [[CMP8]])
576; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
577; CHECK-NEXT:    call void @use(i1 [[CMP9]])
578; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
579; CHECK-NEXT:    call void @use(i1 [[CMP10]])
580; CHECK-NEXT:    ret void
581; CHECK:       end:
582; CHECK-NEXT:    ret void
583;
584  %cmp = icmp sle i32 %x, %z
585  br i1 %cmp, label %if, label %end
586if:
587  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)
588  %cmp1 = icmp slt i32 %cond, %z
589  call void @use(i1 %cmp1)
590  %cmp2 = icmp sle i32 %cond, %z
591  call void @use(i1 %cmp2)
592  %cmp3 = icmp sgt i32 %cond, %z
593  call void @use(i1 %cmp3)
594  %cmp4 = icmp sge i32 %cond, %z
595  call void @use(i1 %cmp4)
596  %cmp5 = icmp ult i32 %cond, %z
597  call void @use(i1 %cmp5)
598  %cmp6 = icmp ule i32 %cond, %z
599  call void @use(i1 %cmp6)
600  %cmp7 = icmp ugt i32 %cond, %z
601  call void @use(i1 %cmp7)
602  %cmp8 = icmp uge i32 %cond, %z
603  call void @use(i1 %cmp8)
604  %cmp9 = icmp eq i32 %cond, %z
605  call void @use(i1 %cmp9)
606  %cmp10 = icmp ne i32 %cond, %z
607  call void @use(i1 %cmp10)
608  ret void
609end:
610  ret void
611}
612
613define void @sle_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
614; CHECK-LABEL: @sle_smin_contextual_commuted(
615; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]
616; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]
617; CHECK:       if:
618; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])
619; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[COND]], [[Z]]
620; CHECK-NEXT:    call void @use(i1 [[CMP1]])
621; CHECK-NEXT:    call void @use(i1 true)
622; CHECK-NEXT:    call void @use(i1 false)
623; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[COND]], [[Z]]
624; CHECK-NEXT:    call void @use(i1 [[CMP4]])
625; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
626; CHECK-NEXT:    call void @use(i1 [[CMP5]])
627; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
628; CHECK-NEXT:    call void @use(i1 [[CMP6]])
629; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
630; CHECK-NEXT:    call void @use(i1 [[CMP7]])
631; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
632; CHECK-NEXT:    call void @use(i1 [[CMP8]])
633; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
634; CHECK-NEXT:    call void @use(i1 [[CMP9]])
635; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
636; CHECK-NEXT:    call void @use(i1 [[CMP10]])
637; CHECK-NEXT:    ret void
638; CHECK:       end:
639; CHECK-NEXT:    ret void
640;
641  %cmp = icmp sle i32 %x, %z
642  br i1 %cmp, label %if, label %end
643if:
644  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)
645  %cmp1 = icmp slt i32 %cond, %z
646  call void @use(i1 %cmp1)
647  %cmp2 = icmp sle i32 %cond, %z
648  call void @use(i1 %cmp2)
649  %cmp3 = icmp sgt i32 %cond, %z
650  call void @use(i1 %cmp3)
651  %cmp4 = icmp sge i32 %cond, %z
652  call void @use(i1 %cmp4)
653  %cmp5 = icmp ult i32 %cond, %z
654  call void @use(i1 %cmp5)
655  %cmp6 = icmp ule i32 %cond, %z
656  call void @use(i1 %cmp6)
657  %cmp7 = icmp ugt i32 %cond, %z
658  call void @use(i1 %cmp7)
659  %cmp8 = icmp uge i32 %cond, %z
660  call void @use(i1 %cmp8)
661  %cmp9 = icmp eq i32 %cond, %z
662  call void @use(i1 %cmp9)
663  %cmp10 = icmp ne i32 %cond, %z
664  call void @use(i1 %cmp10)
665  ret void
666end:
667  ret void
668}
669
670define void @sgt_smin_contextual(i32 %x, i32 %y, i32 %z) {
671; CHECK-LABEL: @sgt_smin_contextual(
672; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]
673; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
674; CHECK:       if:
675; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])
676; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]
677; CHECK-NEXT:    call void @use(i1 [[CMP1]])
678; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[Y]], [[Z]]
679; CHECK-NEXT:    call void @use(i1 [[CMP2]])
680; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[Y]], [[Z]]
681; CHECK-NEXT:    call void @use(i1 [[CMP3]])
682; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]
683; CHECK-NEXT:    call void @use(i1 [[CMP4]])
684; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
685; CHECK-NEXT:    call void @use(i1 [[CMP5]])
686; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
687; CHECK-NEXT:    call void @use(i1 [[CMP6]])
688; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
689; CHECK-NEXT:    call void @use(i1 [[CMP7]])
690; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
691; CHECK-NEXT:    call void @use(i1 [[CMP8]])
692; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
693; CHECK-NEXT:    call void @use(i1 [[CMP9]])
694; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
695; CHECK-NEXT:    call void @use(i1 [[CMP10]])
696; CHECK-NEXT:    ret void
697; CHECK:       end:
698; CHECK-NEXT:    ret void
699;
700  %cmp = icmp sgt i32 %x, %z
701  br i1 %cmp, label %if, label %end
702if:
703  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)
704  %cmp1 = icmp slt i32 %cond, %z
705  call void @use(i1 %cmp1)
706  %cmp2 = icmp sle i32 %cond, %z
707  call void @use(i1 %cmp2)
708  %cmp3 = icmp sgt i32 %cond, %z
709  call void @use(i1 %cmp3)
710  %cmp4 = icmp sge i32 %cond, %z
711  call void @use(i1 %cmp4)
712  %cmp5 = icmp ult i32 %cond, %z
713  call void @use(i1 %cmp5)
714  %cmp6 = icmp ule i32 %cond, %z
715  call void @use(i1 %cmp6)
716  %cmp7 = icmp ugt i32 %cond, %z
717  call void @use(i1 %cmp7)
718  %cmp8 = icmp uge i32 %cond, %z
719  call void @use(i1 %cmp8)
720  %cmp9 = icmp eq i32 %cond, %z
721  call void @use(i1 %cmp9)
722  %cmp10 = icmp ne i32 %cond, %z
723  call void @use(i1 %cmp10)
724  ret void
725end:
726  ret void
727}
728
729define void @sgt_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
730; CHECK-LABEL: @sgt_smin_contextual_commuted(
731; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Z:%.*]]
732; CHECK-NEXT:    br i1 [[CMP]], label [[IF:%.*]], label [[END:%.*]]
733; CHECK:       if:
734; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])
735; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]
736; CHECK-NEXT:    call void @use(i1 [[CMP1]])
737; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[Y]], [[Z]]
738; CHECK-NEXT:    call void @use(i1 [[CMP2]])
739; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[Y]], [[Z]]
740; CHECK-NEXT:    call void @use(i1 [[CMP3]])
741; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]
742; CHECK-NEXT:    call void @use(i1 [[CMP4]])
743; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
744; CHECK-NEXT:    call void @use(i1 [[CMP5]])
745; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
746; CHECK-NEXT:    call void @use(i1 [[CMP6]])
747; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
748; CHECK-NEXT:    call void @use(i1 [[CMP7]])
749; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
750; CHECK-NEXT:    call void @use(i1 [[CMP8]])
751; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[Y]], [[Z]]
752; CHECK-NEXT:    call void @use(i1 [[CMP9]])
753; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[Y]], [[Z]]
754; CHECK-NEXT:    call void @use(i1 [[CMP10]])
755; CHECK-NEXT:    ret void
756; CHECK:       end:
757; CHECK-NEXT:    ret void
758;
759  %cmp = icmp sgt i32 %x, %z
760  br i1 %cmp, label %if, label %end
761if:
762  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)
763  %cmp1 = icmp slt i32 %cond, %z
764  call void @use(i1 %cmp1)
765  %cmp2 = icmp sle i32 %cond, %z
766  call void @use(i1 %cmp2)
767  %cmp3 = icmp sgt i32 %cond, %z
768  call void @use(i1 %cmp3)
769  %cmp4 = icmp sge i32 %cond, %z
770  call void @use(i1 %cmp4)
771  %cmp5 = icmp ult i32 %cond, %z
772  call void @use(i1 %cmp5)
773  %cmp6 = icmp ule i32 %cond, %z
774  call void @use(i1 %cmp6)
775  %cmp7 = icmp ugt i32 %cond, %z
776  call void @use(i1 %cmp7)
777  %cmp8 = icmp uge i32 %cond, %z
778  call void @use(i1 %cmp8)
779  %cmp9 = icmp eq i32 %cond, %z
780  call void @use(i1 %cmp9)
781  %cmp10 = icmp ne i32 %cond, %z
782  call void @use(i1 %cmp10)
783  ret void
784end:
785  ret void
786}
787
788define void @sge_smin_contextual(i32 %x, i32 %y, i32 %z) {
789; CHECK-LABEL: @sge_smin_contextual(
790; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]
791; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]
792; CHECK:       if:
793; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[X]], i32 [[Y:%.*]])
794; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]
795; CHECK-NEXT:    call void @use(i1 [[CMP1]])
796; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[COND]], [[Z]]
797; CHECK-NEXT:    call void @use(i1 [[CMP2]])
798; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[COND]], [[Z]]
799; CHECK-NEXT:    call void @use(i1 [[CMP3]])
800; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]
801; CHECK-NEXT:    call void @use(i1 [[CMP4]])
802; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
803; CHECK-NEXT:    call void @use(i1 [[CMP5]])
804; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
805; CHECK-NEXT:    call void @use(i1 [[CMP6]])
806; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
807; CHECK-NEXT:    call void @use(i1 [[CMP7]])
808; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
809; CHECK-NEXT:    call void @use(i1 [[CMP8]])
810; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
811; CHECK-NEXT:    call void @use(i1 [[CMP9]])
812; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
813; CHECK-NEXT:    call void @use(i1 [[CMP10]])
814; CHECK-NEXT:    ret void
815; CHECK:       end:
816; CHECK-NEXT:    ret void
817;
818  %cmp = icmp sge i32 %x, %z
819  br i1 %cmp, label %if, label %end
820if:
821  %cond = call i32 @llvm.smin.i32(i32 %x, i32 %y)
822  %cmp1 = icmp slt i32 %cond, %z
823  call void @use(i1 %cmp1)
824  %cmp2 = icmp sle i32 %cond, %z
825  call void @use(i1 %cmp2)
826  %cmp3 = icmp sgt i32 %cond, %z
827  call void @use(i1 %cmp3)
828  %cmp4 = icmp sge i32 %cond, %z
829  call void @use(i1 %cmp4)
830  %cmp5 = icmp ult i32 %cond, %z
831  call void @use(i1 %cmp5)
832  %cmp6 = icmp ule i32 %cond, %z
833  call void @use(i1 %cmp6)
834  %cmp7 = icmp ugt i32 %cond, %z
835  call void @use(i1 %cmp7)
836  %cmp8 = icmp uge i32 %cond, %z
837  call void @use(i1 %cmp8)
838  %cmp9 = icmp eq i32 %cond, %z
839  call void @use(i1 %cmp9)
840  %cmp10 = icmp ne i32 %cond, %z
841  call void @use(i1 %cmp10)
842  ret void
843end:
844  ret void
845}
846
847define void @sge_smin_contextual_commuted(i32 %x, i32 %y, i32 %z) {
848; CHECK-LABEL: @sge_smin_contextual_commuted(
849; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp slt i32 [[X:%.*]], [[Z:%.*]]
850; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[END:%.*]], label [[IF:%.*]]
851; CHECK:       if:
852; CHECK-NEXT:    [[COND:%.*]] = call i32 @llvm.smin.i32(i32 [[Y:%.*]], i32 [[X]])
853; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[Y]], [[Z]]
854; CHECK-NEXT:    call void @use(i1 [[CMP1]])
855; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[COND]], [[Z]]
856; CHECK-NEXT:    call void @use(i1 [[CMP2]])
857; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[COND]], [[Z]]
858; CHECK-NEXT:    call void @use(i1 [[CMP3]])
859; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge i32 [[Y]], [[Z]]
860; CHECK-NEXT:    call void @use(i1 [[CMP4]])
861; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult i32 [[COND]], [[Z]]
862; CHECK-NEXT:    call void @use(i1 [[CMP5]])
863; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule i32 [[COND]], [[Z]]
864; CHECK-NEXT:    call void @use(i1 [[CMP6]])
865; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt i32 [[COND]], [[Z]]
866; CHECK-NEXT:    call void @use(i1 [[CMP7]])
867; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge i32 [[COND]], [[Z]]
868; CHECK-NEXT:    call void @use(i1 [[CMP8]])
869; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq i32 [[COND]], [[Z]]
870; CHECK-NEXT:    call void @use(i1 [[CMP9]])
871; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne i32 [[COND]], [[Z]]
872; CHECK-NEXT:    call void @use(i1 [[CMP10]])
873; CHECK-NEXT:    ret void
874; CHECK:       end:
875; CHECK-NEXT:    ret void
876;
877  %cmp = icmp sge i32 %x, %z
878  br i1 %cmp, label %if, label %end
879if:
880  %cond = call i32 @llvm.smin.i32(i32 %y, i32 %x)
881  %cmp1 = icmp slt i32 %cond, %z
882  call void @use(i1 %cmp1)
883  %cmp2 = icmp sle i32 %cond, %z
884  call void @use(i1 %cmp2)
885  %cmp3 = icmp sgt i32 %cond, %z
886  call void @use(i1 %cmp3)
887  %cmp4 = icmp sge i32 %cond, %z
888  call void @use(i1 %cmp4)
889  %cmp5 = icmp ult i32 %cond, %z
890  call void @use(i1 %cmp5)
891  %cmp6 = icmp ule i32 %cond, %z
892  call void @use(i1 %cmp6)
893  %cmp7 = icmp ugt i32 %cond, %z
894  call void @use(i1 %cmp7)
895  %cmp8 = icmp uge i32 %cond, %z
896  call void @use(i1 %cmp8)
897  %cmp9 = icmp eq i32 %cond, %z
898  call void @use(i1 %cmp9)
899  %cmp10 = icmp ne i32 %cond, %z
900  call void @use(i1 %cmp10)
901  ret void
902end:
903  ret void
904}
905
906declare void @use_v2i1(<2 x i1> %c)
907
908; icmp pred smin(X, Y), X
909define void @eq_smin_v2i32(<2 x i32> %x, <2 x i32> %y) {
910; CHECK-LABEL: @eq_smin_v2i32(
911; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[X:%.*]], <2 x i32> [[Y:%.*]])
912; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], [[X]]
913; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])
914; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))
915; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)
916; CHECK-NEXT:    [[CMP4:%.*]] = icmp sge <2 x i32> [[Y]], [[X]]
917; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])
918; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], [[X]]
919; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])
920; CHECK-NEXT:    [[CMP6:%.*]] = icmp ule <2 x i32> [[COND]], [[X]]
921; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])
922; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], [[X]]
923; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])
924; CHECK-NEXT:    [[CMP8:%.*]] = icmp uge <2 x i32> [[COND]], [[X]]
925; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])
926; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle <2 x i32> [[X]], [[Y]]
927; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])
928; CHECK-NEXT:    [[CMP10:%.*]] = icmp sgt <2 x i32> [[X]], [[Y]]
929; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])
930; CHECK-NEXT:    ret void
931;
932  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %x, <2 x i32> %y)
933  %cmp1 = icmp slt <2 x i32> %cond, %x
934  call void @use_v2i1(<2 x i1> %cmp1)
935  %cmp2 = icmp sle <2 x i32> %cond, %x
936  call void @use_v2i1(<2 x i1> %cmp2)
937  %cmp3 = icmp sgt <2 x i32> %cond, %x
938  call void @use_v2i1(<2 x i1> %cmp3)
939  %cmp4 = icmp sge <2 x i32> %cond, %x
940  call void @use_v2i1(<2 x i1> %cmp4)
941  %cmp5 = icmp ult <2 x i32> %cond, %x
942  call void @use_v2i1(<2 x i1> %cmp5)
943  %cmp6 = icmp ule <2 x i32> %cond, %x
944  call void @use_v2i1(<2 x i1> %cmp6)
945  %cmp7 = icmp ugt <2 x i32> %cond, %x
946  call void @use_v2i1(<2 x i1> %cmp7)
947  %cmp8 = icmp uge <2 x i32> %cond, %x
948  call void @use_v2i1(<2 x i1> %cmp8)
949  %cmp9 = icmp eq <2 x i32> %cond, %x
950  call void @use_v2i1(<2 x i1> %cmp9)
951  %cmp10 = icmp ne <2 x i32> %cond, %x
952  call void @use_v2i1(<2 x i1> %cmp10)
953  ret void
954}
955
956; icmp pred smin(C1, Y), C2 where C1 == C2
957define void @eq_smin_v2i32_constant(<2 x i32> %y) {
958; CHECK-LABEL: @eq_smin_v2i32_constant(
959; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 10))
960; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)
961; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])
962; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))
963; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)
964; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)
965; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])
966; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)
967; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])
968; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)
969; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])
970; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)
971; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])
972; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)
973; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])
974; CHECK-NEXT:    [[CMP9:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)
975; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])
976; CHECK-NEXT:    [[CMP10:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)
977; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])
978; CHECK-NEXT:    ret void
979;
980  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 10, i32 10>, <2 x i32> %y)
981  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>
982  call void @use_v2i1(<2 x i1> %cmp1)
983  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>
984  call void @use_v2i1(<2 x i1> %cmp2)
985  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>
986  call void @use_v2i1(<2 x i1> %cmp3)
987  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>
988  call void @use_v2i1(<2 x i1> %cmp4)
989  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>
990  call void @use_v2i1(<2 x i1> %cmp5)
991  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>
992  call void @use_v2i1(<2 x i1> %cmp6)
993  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>
994  call void @use_v2i1(<2 x i1> %cmp7)
995  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>
996  call void @use_v2i1(<2 x i1> %cmp8)
997  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>
998  call void @use_v2i1(<2 x i1> %cmp9)
999  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>
1000  call void @use_v2i1(<2 x i1> %cmp10)
1001  ret void
1002}
1003
1004; icmp pred smin(C1, Y), C2 where C1 < C2
1005define void @slt_smin_v2i32_constant(<2 x i32> %y) {
1006; CHECK-LABEL: @slt_smin_v2i32_constant(
1007; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 5))
1008; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))
1009; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))
1010; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)
1011; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)
1012; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)
1013; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])
1014; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)
1015; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])
1016; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)
1017; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])
1018; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)
1019; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])
1020; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)
1021; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))
1022; CHECK-NEXT:    ret void
1023;
1024  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 5>, <2 x i32> %y)
1025  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>
1026  call void @use_v2i1(<2 x i1> %cmp1)
1027  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>
1028  call void @use_v2i1(<2 x i1> %cmp2)
1029  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>
1030  call void @use_v2i1(<2 x i1> %cmp3)
1031  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>
1032  call void @use_v2i1(<2 x i1> %cmp4)
1033  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>
1034  call void @use_v2i1(<2 x i1> %cmp5)
1035  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>
1036  call void @use_v2i1(<2 x i1> %cmp6)
1037  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>
1038  call void @use_v2i1(<2 x i1> %cmp7)
1039  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>
1040  call void @use_v2i1(<2 x i1> %cmp8)
1041  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>
1042  call void @use_v2i1(<2 x i1> %cmp9)
1043  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>
1044  call void @use_v2i1(<2 x i1> %cmp10)
1045  ret void
1046}
1047
1048; icmp pred smin(C1, Y), C2 where C1 <= C2
1049define void @sle_smin_v2i32_constant(<2 x i32> %y) {
1050; CHECK-LABEL: @sle_smin_v2i32_constant(
1051; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 5, i32 10>)
1052; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 10)
1053; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])
1054; CHECK-NEXT:    call void @use_v2i1(<2 x i1> splat (i1 true))
1055; CHECK-NEXT:    call void @use_v2i1(<2 x i1> zeroinitializer)
1056; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 9)
1057; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])
1058; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)
1059; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])
1060; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)
1061; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])
1062; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)
1063; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])
1064; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)
1065; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])
1066; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10)
1067; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])
1068; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10)
1069; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])
1070; CHECK-NEXT:    ret void
1071;
1072  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 10>, <2 x i32> %y)
1073  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>
1074  call void @use_v2i1(<2 x i1> %cmp1)
1075  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>
1076  call void @use_v2i1(<2 x i1> %cmp2)
1077  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>
1078  call void @use_v2i1(<2 x i1> %cmp3)
1079  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>
1080  call void @use_v2i1(<2 x i1> %cmp4)
1081  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>
1082  call void @use_v2i1(<2 x i1> %cmp5)
1083  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>
1084  call void @use_v2i1(<2 x i1> %cmp6)
1085  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>
1086  call void @use_v2i1(<2 x i1> %cmp7)
1087  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>
1088  call void @use_v2i1(<2 x i1> %cmp8)
1089  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>
1090  call void @use_v2i1(<2 x i1> %cmp9)
1091  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>
1092  call void @use_v2i1(<2 x i1> %cmp10)
1093  ret void
1094}
1095
1096; icmp pred smin(C1, Y), C2 where C1 > C2
1097define void @sgt_smin_v2i32_constant(<2 x i32> %y) {
1098; CHECK-LABEL: @sgt_smin_v2i32_constant(
1099; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> splat (i32 15))
1100; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)
1101; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])
1102; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 11)
1103; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP2]])
1104; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 10)
1105; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP3]])
1106; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)
1107; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])
1108; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)
1109; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])
1110; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)
1111; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])
1112; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)
1113; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])
1114; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)
1115; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])
1116; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[Y]], splat (i32 10)
1117; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])
1118; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[Y]], splat (i32 10)
1119; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])
1120; CHECK-NEXT:    ret void
1121;
1122  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 15, i32 15>, <2 x i32> %y)
1123  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>
1124  call void @use_v2i1(<2 x i1> %cmp1)
1125  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>
1126  call void @use_v2i1(<2 x i1> %cmp2)
1127  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>
1128  call void @use_v2i1(<2 x i1> %cmp3)
1129  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>
1130  call void @use_v2i1(<2 x i1> %cmp4)
1131  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>
1132  call void @use_v2i1(<2 x i1> %cmp5)
1133  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>
1134  call void @use_v2i1(<2 x i1> %cmp6)
1135  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>
1136  call void @use_v2i1(<2 x i1> %cmp7)
1137  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>
1138  call void @use_v2i1(<2 x i1> %cmp8)
1139  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>
1140  call void @use_v2i1(<2 x i1> %cmp9)
1141  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>
1142  call void @use_v2i1(<2 x i1> %cmp10)
1143  ret void
1144}
1145
1146; icmp pred smin(C1, Y), C2 where C1 >= C2
1147define void @sge_smin_v2i32_constant(<2 x i32> %y) {
1148; CHECK-LABEL: @sge_smin_v2i32_constant(
1149; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 15, i32 10>)
1150; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[Y]], splat (i32 10)
1151; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])
1152; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 11)
1153; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP2]])
1154; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 10)
1155; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP3]])
1156; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[Y]], splat (i32 9)
1157; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])
1158; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)
1159; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])
1160; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)
1161; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])
1162; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)
1163; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])
1164; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)
1165; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])
1166; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10)
1167; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])
1168; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10)
1169; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])
1170; CHECK-NEXT:    ret void
1171;
1172  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 15, i32 10>, <2 x i32> %y)
1173  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>
1174  call void @use_v2i1(<2 x i1> %cmp1)
1175  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>
1176  call void @use_v2i1(<2 x i1> %cmp2)
1177  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>
1178  call void @use_v2i1(<2 x i1> %cmp3)
1179  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>
1180  call void @use_v2i1(<2 x i1> %cmp4)
1181  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>
1182  call void @use_v2i1(<2 x i1> %cmp5)
1183  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>
1184  call void @use_v2i1(<2 x i1> %cmp6)
1185  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>
1186  call void @use_v2i1(<2 x i1> %cmp7)
1187  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>
1188  call void @use_v2i1(<2 x i1> %cmp8)
1189  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>
1190  call void @use_v2i1(<2 x i1> %cmp9)
1191  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>
1192  call void @use_v2i1(<2 x i1> %cmp10)
1193  ret void
1194}
1195
1196; icmp pred smin(C1, Y), C2 where (icmp pred' C1, C2) is not a constant splat for all pred'
1197define void @unknown_smin_v2i32_constant(<2 x i32> %y) {
1198; CHECK-LABEL: @unknown_smin_v2i32_constant(
1199; CHECK-NEXT:    [[COND:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[Y:%.*]], <2 x i32> <i32 5, i32 15>)
1200; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 10)
1201; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP1]])
1202; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt <2 x i32> [[COND]], splat (i32 11)
1203; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP2]])
1204; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 10)
1205; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP3]])
1206; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt <2 x i32> [[COND]], splat (i32 9)
1207; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP4]])
1208; CHECK-NEXT:    [[CMP5:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 10)
1209; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP5]])
1210; CHECK-NEXT:    [[CMP6:%.*]] = icmp ult <2 x i32> [[COND]], splat (i32 11)
1211; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP6]])
1212; CHECK-NEXT:    [[CMP7:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 10)
1213; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP7]])
1214; CHECK-NEXT:    [[CMP8:%.*]] = icmp ugt <2 x i32> [[COND]], splat (i32 9)
1215; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP8]])
1216; CHECK-NEXT:    [[CMP9:%.*]] = icmp eq <2 x i32> [[COND]], splat (i32 10)
1217; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP9]])
1218; CHECK-NEXT:    [[CMP10:%.*]] = icmp ne <2 x i32> [[COND]], splat (i32 10)
1219; CHECK-NEXT:    call void @use_v2i1(<2 x i1> [[CMP10]])
1220; CHECK-NEXT:    ret void
1221;
1222  %cond = call <2 x i32> @llvm.smin.v2i32(<2 x i32> <i32 5, i32 15>, <2 x i32> %y)
1223  %cmp1 = icmp slt <2 x i32> %cond, <i32 10, i32 10>
1224  call void @use_v2i1(<2 x i1> %cmp1)
1225  %cmp2 = icmp sle <2 x i32> %cond, <i32 10, i32 10>
1226  call void @use_v2i1(<2 x i1> %cmp2)
1227  %cmp3 = icmp sgt <2 x i32> %cond, <i32 10, i32 10>
1228  call void @use_v2i1(<2 x i1> %cmp3)
1229  %cmp4 = icmp sge <2 x i32> %cond, <i32 10, i32 10>
1230  call void @use_v2i1(<2 x i1> %cmp4)
1231  %cmp5 = icmp ult <2 x i32> %cond, <i32 10, i32 10>
1232  call void @use_v2i1(<2 x i1> %cmp5)
1233  %cmp6 = icmp ule <2 x i32> %cond, <i32 10, i32 10>
1234  call void @use_v2i1(<2 x i1> %cmp6)
1235  %cmp7 = icmp ugt <2 x i32> %cond, <i32 10, i32 10>
1236  call void @use_v2i1(<2 x i1> %cmp7)
1237  %cmp8 = icmp uge <2 x i32> %cond, <i32 10, i32 10>
1238  call void @use_v2i1(<2 x i1> %cmp8)
1239  %cmp9 = icmp eq <2 x i32> %cond, <i32 10, i32 10>
1240  call void @use_v2i1(<2 x i1> %cmp9)
1241  %cmp10 = icmp ne <2 x i32> %cond, <i32 10, i32 10>
1242  call void @use_v2i1(<2 x i1> %cmp10)
1243  ret void
1244}
1245
1246; Test cases from PR62898
1247
1248define i1 @smin_or_bitwise(i32 %x) {
1249; CHECK-LABEL: @smin_or_bitwise(
1250; CHECK-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 1)
1251; CHECK-NEXT:    [[LOBIT:%.*]] = or i32 [[COND]], [[X]]
1252; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp slt i32 [[LOBIT]], 0
1253; CHECK-NEXT:    ret i1 [[TOBOOL]]
1254;
1255  %cond = tail call i32 @llvm.smin.i32(i32 %x, i32 1)
1256  %lobit = or i32 %cond, %x
1257  %tobool = icmp slt i32 %lobit, 0
1258  ret i1 %tobool
1259}
1260
1261define i1 @smin_and_bitwise(i32 %x) {
1262; CHECK-LABEL: @smin_and_bitwise(
1263; CHECK-NEXT:    [[COND:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 1)
1264; CHECK-NEXT:    [[LOBIT:%.*]] = and i32 [[COND]], [[X]]
1265; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp slt i32 [[LOBIT]], 0
1266; CHECK-NEXT:    ret i1 [[TOBOOL]]
1267;
1268  %cond = tail call i32 @llvm.smin.i32(i32 %x, i32 1)
1269  %lobit = and i32 %cond, %x
1270  %tobool = icmp slt i32 %lobit, 0
1271  ret i1 %tobool
1272}
1273
1274; try to fold icmp eq smin(X, Y), Z
1275; pre-condition X != Z
1276; X < Z fail
1277; swap X and Y
1278; pre-condition Y != Z fail
1279; Y < Z fail
1280define i1 @eq_smin_nofold(i32 %x) {
1281; CHECK-LABEL: @eq_smin_nofold(
1282; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[X:%.*]], 5
1283; CHECK-NEXT:    call void @llvm.assume(i1 [[COND]])
1284; CHECK-NEXT:    [[MINV:%.*]] = tail call i32 @llvm.smin.i32(i32 [[X]], i32 5)
1285; CHECK-NEXT:    [[RET:%.*]] = icmp eq i32 [[MINV]], 5
1286; CHECK-NEXT:    ret i1 [[RET]]
1287;
1288  %cond = icmp ne i32 %x, 5
1289  call void @llvm.assume(i1 %cond)
1290  %minv = tail call i32 @llvm.smin.i32(i32 %x, i32 5)
1291  %ret = icmp eq i32 %minv, 5
1292  ret i1 %ret
1293}
1294
1295declare void @llvm.assume(i1)
1296declare i32 @llvm.smin.i32(i32, i32)
1297declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)
1298