xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/logical-operations.ll (revision 0d38f21e4ab7fe7cebe76a9d7c218ec54dba1e98)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -passes='print<scalar-evolution>' < %s -disable-output 2>&1 | FileCheck %s
3
4@constant = dso_local global i8 0, align 4
5@another_constant = dso_local global i8 0, align 4
6
7define i1 @binary_or.i1(i1 %x, i1 %y) {
8; CHECK-LABEL: 'binary_or.i1'
9; CHECK-NEXT:  Classifying expressions for: @binary_or.i1
10; CHECK-NEXT:    %r = or i1 %x, %y
11; CHECK-NEXT:    --> (%x umax %y) U: full-set S: full-set
12; CHECK-NEXT:  Determining loop execution counts for: @binary_or.i1
13;
14  %r = or i1 %x, %y
15  ret i1 %r
16}
17
18define i2 @binary_or.i2(i2 %x, i2 %y) {
19; CHECK-LABEL: 'binary_or.i2'
20; CHECK-NEXT:  Classifying expressions for: @binary_or.i2
21; CHECK-NEXT:    %r = or i2 %x, %y
22; CHECK-NEXT:    --> %r U: full-set S: full-set
23; CHECK-NEXT:  Determining loop execution counts for: @binary_or.i2
24;
25  %r = or i2 %x, %y
26  ret i2 %r
27}
28
29define i1 @binary_or.4ops.i1(i1 %x, i1 %y, i1 %z, i1 %a) {
30; CHECK-LABEL: 'binary_or.4ops.i1'
31; CHECK-NEXT:  Classifying expressions for: @binary_or.4ops.i1
32; CHECK-NEXT:    %t0 = or i1 %x, %y
33; CHECK-NEXT:    --> (%x umax %y) U: full-set S: full-set
34; CHECK-NEXT:    %t1 = or i1 %z, %a
35; CHECK-NEXT:    --> (%z umax %a) U: full-set S: full-set
36; CHECK-NEXT:    %r = or i1 %t0, %t1
37; CHECK-NEXT:    --> (%x umax %y umax %z umax %a) U: full-set S: full-set
38; CHECK-NEXT:  Determining loop execution counts for: @binary_or.4ops.i1
39;
40  %t0 = or i1 %x, %y
41  %t1 = or i1 %z, %a
42  %r = or i1 %t0, %t1
43  ret i1 %r
44}
45
46define i1 @binary_and.i1(i1 %x, i1 %y) {
47; CHECK-LABEL: 'binary_and.i1'
48; CHECK-NEXT:  Classifying expressions for: @binary_and.i1
49; CHECK-NEXT:    %r = and i1 %x, %y
50; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
51; CHECK-NEXT:  Determining loop execution counts for: @binary_and.i1
52;
53  %r = and i1 %x, %y
54  ret i1 %r
55}
56
57define i2 @binary_and.i2(i2 %x, i2 %y) {
58; CHECK-LABEL: 'binary_and.i2'
59; CHECK-NEXT:  Classifying expressions for: @binary_and.i2
60; CHECK-NEXT:    %r = and i2 %x, %y
61; CHECK-NEXT:    --> %r U: full-set S: full-set
62; CHECK-NEXT:  Determining loop execution counts for: @binary_and.i2
63;
64  %r = and i2 %x, %y
65  ret i2 %r
66}
67
68define i1 @binary_and.4ops.i1(i1 %x, i1 %y, i1 %z, i1 %a) {
69; CHECK-LABEL: 'binary_and.4ops.i1'
70; CHECK-NEXT:  Classifying expressions for: @binary_and.4ops.i1
71; CHECK-NEXT:    %t0 = and i1 %x, %y
72; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
73; CHECK-NEXT:    %t1 = and i1 %z, %a
74; CHECK-NEXT:    --> (%z umin %a) U: full-set S: full-set
75; CHECK-NEXT:    %r = and i1 %t0, %t1
76; CHECK-NEXT:    --> (%x umin %y umin %z umin %a) U: full-set S: full-set
77; CHECK-NEXT:  Determining loop execution counts for: @binary_and.4ops.i1
78;
79  %t0 = and i1 %x, %y
80  %t1 = and i1 %z, %a
81  %r = and i1 %t0, %t1
82  ret i1 %r
83}
84
85define i1 @binary_xor.i1(i1 %x, i1 %y) {
86; CHECK-LABEL: 'binary_xor.i1'
87; CHECK-NEXT:  Classifying expressions for: @binary_xor.i1
88; CHECK-NEXT:    %r = xor i1 %x, %y
89; CHECK-NEXT:    --> (%x + %y) U: full-set S: full-set
90; CHECK-NEXT:  Determining loop execution counts for: @binary_xor.i1
91;
92  %r = xor i1 %x, %y
93  ret i1 %r
94}
95
96define i2 @binary_xor.i2(i2 %x, i2 %y) {
97; CHECK-LABEL: 'binary_xor.i2'
98; CHECK-NEXT:  Classifying expressions for: @binary_xor.i2
99; CHECK-NEXT:    %r = xor i2 %x, %y
100; CHECK-NEXT:    --> %r U: full-set S: full-set
101; CHECK-NEXT:  Determining loop execution counts for: @binary_xor.i2
102;
103  %r = xor i2 %x, %y
104  ret i2 %r
105}
106
107define i1 @binary_xor.4ops.i1(i1 %x, i1 %y, i1 %z, i1 %a) {
108; CHECK-LABEL: 'binary_xor.4ops.i1'
109; CHECK-NEXT:  Classifying expressions for: @binary_xor.4ops.i1
110; CHECK-NEXT:    %t0 = xor i1 %x, %y
111; CHECK-NEXT:    --> (%x + %y) U: full-set S: full-set
112; CHECK-NEXT:    %t1 = xor i1 %z, %a
113; CHECK-NEXT:    --> (%z + %a) U: full-set S: full-set
114; CHECK-NEXT:    %r = xor i1 %t0, %t1
115; CHECK-NEXT:    --> (%x + %y + %z + %a) U: full-set S: full-set
116; CHECK-NEXT:  Determining loop execution counts for: @binary_xor.4ops.i1
117;
118  %t0 = xor i1 %x, %y
119  %t1 = xor i1 %z, %a
120  %r = xor i1 %t0, %t1
121  ret i1 %r
122}
123
124define i1 @logical_or(i1 %x, i1 %y) {
125; CHECK-LABEL: 'logical_or'
126; CHECK-NEXT:  Classifying expressions for: @logical_or
127; CHECK-NEXT:    %r = select i1 %x, i1 true, i1 %y
128; CHECK-NEXT:    --> (true + ((true + %x) umin_seq (true + %y))) U: full-set S: full-set
129; CHECK-NEXT:  Determining loop execution counts for: @logical_or
130;
131  %r = select i1 %x, i1 true, i1 %y
132  ret i1 %r
133}
134
135define i1 @logical_and(i1 %x, i1 %y) {
136; CHECK-LABEL: 'logical_and'
137; CHECK-NEXT:  Classifying expressions for: @logical_and
138; CHECK-NEXT:    %r = select i1 %x, i1 %y, i1 false
139; CHECK-NEXT:    --> (%x umin_seq %y) U: full-set S: full-set
140; CHECK-NEXT:  Determining loop execution counts for: @logical_and
141;
142  %r = select i1 %x, i1 %y, i1 false
143  ret i1 %r
144}
145
146define i1 @select_x_or_false(i1 %c, i1 %x) {
147; CHECK-LABEL: 'select_x_or_false'
148; CHECK-NEXT:  Classifying expressions for: @select_x_or_false
149; CHECK-NEXT:    %r = select i1 %c, i1 %x, i1 false
150; CHECK-NEXT:    --> (%c umin_seq %x) U: full-set S: full-set
151; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_false
152;
153  %r = select i1 %c, i1 %x, i1 false
154  ret i1 %r
155}
156
157define i1 @select_false_or_x(i1 %c, i1 %x) {
158; CHECK-LABEL: 'select_false_or_x'
159; CHECK-NEXT:  Classifying expressions for: @select_false_or_x
160; CHECK-NEXT:    %r = select i1 %c, i1 false, i1 %x
161; CHECK-NEXT:    --> ((true + %c) umin_seq %x) U: full-set S: full-set
162; CHECK-NEXT:  Determining loop execution counts for: @select_false_or_x
163;
164  %r = select i1 %c, i1 false, i1 %x
165  ret i1 %r
166}
167
168define i1 @select_x_or_true(i1 %c, i1 %x) {
169; CHECK-LABEL: 'select_x_or_true'
170; CHECK-NEXT:  Classifying expressions for: @select_x_or_true
171; CHECK-NEXT:    %r = select i1 %c, i1 %x, i1 true
172; CHECK-NEXT:    --> (true + (%c umin_seq (true + %x))) U: full-set S: full-set
173; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_true
174;
175  %r = select i1 %c, i1 %x, i1 true
176  ret i1 %r
177}
178
179define i1 @select_true_or_x(i1 %c, i1 %x) {
180; CHECK-LABEL: 'select_true_or_x'
181; CHECK-NEXT:  Classifying expressions for: @select_true_or_x
182; CHECK-NEXT:    %r = select i1 %c, i1 true, i1 %x
183; CHECK-NEXT:    --> (true + ((true + %c) umin_seq (true + %x))) U: full-set S: full-set
184; CHECK-NEXT:  Determining loop execution counts for: @select_true_or_x
185;
186  %r = select i1 %c, i1 true, i1 %x
187  ret i1 %r
188}
189
190define i32 @select_x_or_zero(i1 %c, i32 %x) {
191; CHECK-LABEL: 'select_x_or_zero'
192; CHECK-NEXT:  Classifying expressions for: @select_x_or_zero
193; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 0
194; CHECK-NEXT:    --> %r U: full-set S: full-set
195; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_zero
196;
197  %r = select i1 %c, i32 %x, i32 0
198  ret i32 %r
199}
200
201define i32 @select_zero_or_x(i1 %c, i32 %x) {
202; CHECK-LABEL: 'select_zero_or_x'
203; CHECK-NEXT:  Classifying expressions for: @select_zero_or_x
204; CHECK-NEXT:    %r = select i1 %c, i32 0, i32 %x
205; CHECK-NEXT:    --> %r U: full-set S: full-set
206; CHECK-NEXT:  Determining loop execution counts for: @select_zero_or_x
207;
208  %r = select i1 %c, i32 0, i32 %x
209  ret i32 %r
210}
211
212define i32 @select_x_or_allones(i1 %c, i32 %x) {
213; CHECK-LABEL: 'select_x_or_allones'
214; CHECK-NEXT:  Classifying expressions for: @select_x_or_allones
215; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 -1
216; CHECK-NEXT:    --> %r U: full-set S: full-set
217; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_allones
218;
219  %r = select i1 %c, i32 %x, i32 -1
220  ret i32 %r
221}
222
223define i32 @select_allones_or_x(i1 %c, i32 %x) {
224; CHECK-LABEL: 'select_allones_or_x'
225; CHECK-NEXT:  Classifying expressions for: @select_allones_or_x
226; CHECK-NEXT:    %r = select i1 %c, i32 -1, i32 %x
227; CHECK-NEXT:    --> %r U: full-set S: full-set
228; CHECK-NEXT:  Determining loop execution counts for: @select_allones_or_x
229;
230  %r = select i1 %c, i32 -1, i32 %x
231  ret i32 %r
232}
233
234define i32 @select_x_or_intmax(i1 %c, i32 %x) {
235; CHECK-LABEL: 'select_x_or_intmax'
236; CHECK-NEXT:  Classifying expressions for: @select_x_or_intmax
237; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 2147483647
238; CHECK-NEXT:    --> %r U: full-set S: full-set
239; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_intmax
240;
241  %r = select i1 %c, i32 %x, i32 2147483647
242  ret i32 %r
243}
244
245define i32 @select_intmax_or_x(i1 %c, i32 %x) {
246; CHECK-LABEL: 'select_intmax_or_x'
247; CHECK-NEXT:  Classifying expressions for: @select_intmax_or_x
248; CHECK-NEXT:    %r = select i1 %c, i32 2147483647, i32 %x
249; CHECK-NEXT:    --> %r U: full-set S: full-set
250; CHECK-NEXT:  Determining loop execution counts for: @select_intmax_or_x
251;
252  %r = select i1 %c, i32 2147483647, i32 %x
253  ret i32 %r
254}
255
256define i32 @select_x_or_intmin(i1 %c, i32 %x) {
257; CHECK-LABEL: 'select_x_or_intmin'
258; CHECK-NEXT:  Classifying expressions for: @select_x_or_intmin
259; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 -2147483648
260; CHECK-NEXT:    --> %r U: full-set S: full-set
261; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_intmin
262;
263  %r = select i1 %c, i32 %x, i32 -2147483648
264  ret i32 %r
265}
266
267define i32 @select_intmin_or_x(i1 %c, i32 %x) {
268; CHECK-LABEL: 'select_intmin_or_x'
269; CHECK-NEXT:  Classifying expressions for: @select_intmin_or_x
270; CHECK-NEXT:    %r = select i1 %c, i32 -2147483648, i32 %x
271; CHECK-NEXT:    --> %r U: full-set S: full-set
272; CHECK-NEXT:  Determining loop execution counts for: @select_intmin_or_x
273;
274  %r = select i1 %c, i32 -2147483648, i32 %x
275  ret i32 %r
276}
277
278define i32 @select_x_or_constant(i1 %c, i32 %x) {
279; CHECK-LABEL: 'select_x_or_constant'
280; CHECK-NEXT:  Classifying expressions for: @select_x_or_constant
281; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 42
282; CHECK-NEXT:    --> %r U: full-set S: full-set
283; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_constant
284;
285  %r = select i1 %c, i32 %x, i32 42
286  ret i32 %r
287}
288
289define i32 @select_constant_or_x(i1 %c, i32 %y) {
290; CHECK-LABEL: 'select_constant_or_x'
291; CHECK-NEXT:  Classifying expressions for: @select_constant_or_x
292; CHECK-NEXT:    %r = select i1 %c, i32 42, i32 %y
293; CHECK-NEXT:    --> %r U: full-set S: full-set
294; CHECK-NEXT:  Determining loop execution counts for: @select_constant_or_x
295;
296  %r = select i1 %c, i32 42, i32 %y
297  ret i32 %r
298}
299
300define i32 @select_between_constants(i1 %c, i32 %y) {
301; CHECK-LABEL: 'select_between_constants'
302; CHECK-NEXT:  Classifying expressions for: @select_between_constants
303; CHECK-NEXT:    %r = select i1 %c, i32 42, i32 24
304; CHECK-NEXT:    --> %r U: [8,59) S: [8,59)
305; CHECK-NEXT:  Determining loop execution counts for: @select_between_constants
306;
307  %r = select i1 %c, i32 42, i32 24
308  ret i32 %r
309}
310
311define i32 @select_x_or_y(i1 %c, i32 %x, i32 %y) {
312; CHECK-LABEL: 'select_x_or_y'
313; CHECK-NEXT:  Classifying expressions for: @select_x_or_y
314; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 %y
315; CHECK-NEXT:    --> %r U: full-set S: full-set
316; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_y
317;
318  %r = select i1 %c, i32 %x, i32 %y
319  ret i32 %r
320}
321
322define i32 @select_x_or_y__noundef(i1 %c, i32 noundef %x, i32 noundef %y) {
323; CHECK-LABEL: 'select_x_or_y__noundef'
324; CHECK-NEXT:  Classifying expressions for: @select_x_or_y__noundef
325; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 %y
326; CHECK-NEXT:    --> %r U: full-set S: full-set
327; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_y__noundef
328;
329  %r = select i1 %c, i32 %x, i32 %y
330  ret i32 %r
331}
332
333define i32 @select_x_or_constantexpr(i1 %c, i32 %x) {
334; CHECK-LABEL: 'select_x_or_constantexpr'
335; CHECK-NEXT:  Classifying expressions for: @select_x_or_constantexpr
336; CHECK-NEXT:    %r = select i1 %c, i32 %x, i32 ptrtoint (ptr @constant to i32)
337; CHECK-NEXT:    --> %r U: full-set S: full-set
338; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_constantexpr
339;
340  %r = select i1 %c, i32 %x, i32 ptrtoint (ptr @constant to i32)
341  ret i32 %r
342}
343
344define i32 @select_constantexpr_or_x(i1 %c, i32 %x) {
345; CHECK-LABEL: 'select_constantexpr_or_x'
346; CHECK-NEXT:  Classifying expressions for: @select_constantexpr_or_x
347; CHECK-NEXT:    %r = select i1 %c, i32 ptrtoint (ptr @constant to i32), i32 %x
348; CHECK-NEXT:    --> %r U: full-set S: full-set
349; CHECK-NEXT:  Determining loop execution counts for: @select_constantexpr_or_x
350;
351  %r = select i1 %c, i32 ptrtoint (ptr @constant to i32), i32 %x
352  ret i32 %r
353}
354
355define ptr @select_x_or_nullptr(i1 %c, ptr %x) {
356; CHECK-LABEL: 'select_x_or_nullptr'
357; CHECK-NEXT:  Classifying expressions for: @select_x_or_nullptr
358; CHECK-NEXT:    %r = select i1 %c, ptr %x, ptr null
359; CHECK-NEXT:    --> %r U: full-set S: full-set
360; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_nullptr
361;
362  %r = select i1 %c, ptr %x, ptr null
363  ret ptr %r
364}
365
366define ptr @select_null_or_x(i1 %c, ptr %x) {
367; CHECK-LABEL: 'select_null_or_x'
368; CHECK-NEXT:  Classifying expressions for: @select_null_or_x
369; CHECK-NEXT:    %r = select i1 %c, ptr null, ptr %x
370; CHECK-NEXT:    --> %r U: full-set S: full-set
371; CHECK-NEXT:  Determining loop execution counts for: @select_null_or_x
372;
373  %r = select i1 %c, ptr null, ptr %x
374  ret ptr %r
375}
376
377define ptr @select_x_or_constantptr(i1 %c, ptr %x) {
378; CHECK-LABEL: 'select_x_or_constantptr'
379; CHECK-NEXT:  Classifying expressions for: @select_x_or_constantptr
380; CHECK-NEXT:    %r = select i1 %c, ptr %x, ptr @constant
381; CHECK-NEXT:    --> %r U: full-set S: full-set
382; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_constantptr
383;
384  %r = select i1 %c, ptr %x, ptr @constant
385  ret ptr %r
386}
387
388define ptr @select_constantptr_or_x(i1 %c, ptr %x) {
389; CHECK-LABEL: 'select_constantptr_or_x'
390; CHECK-NEXT:  Classifying expressions for: @select_constantptr_or_x
391; CHECK-NEXT:    %r = select i1 %c, ptr @constant, ptr %x
392; CHECK-NEXT:    --> %r U: full-set S: full-set
393; CHECK-NEXT:  Determining loop execution counts for: @select_constantptr_or_x
394;
395  %r = select i1 %c, ptr @constant, ptr %x
396  ret ptr %r
397}
398
399define ptr @select_between_constantptrs(i1 %c, ptr %x) {
400; CHECK-LABEL: 'select_between_constantptrs'
401; CHECK-NEXT:  Classifying expressions for: @select_between_constantptrs
402; CHECK-NEXT:    %r = select i1 %c, ptr @constant, ptr @another_constant
403; CHECK-NEXT:    --> %r U: [0,-3) S: [-9223372036854775808,9223372036854775805)
404; CHECK-NEXT:  Determining loop execution counts for: @select_between_constantptrs
405;
406  %r = select i1 %c, ptr @constant, ptr @another_constant
407  ret ptr %r
408}
409
410define ptr @tautological_select() {
411; CHECK-LABEL: 'tautological_select'
412; CHECK-NEXT:  Classifying expressions for: @tautological_select
413; CHECK-NEXT:    %s = select i1 true, ptr @constant, ptr @another_constant
414; CHECK-NEXT:    --> @constant U: [0,-3) S: [-9223372036854775808,9223372036854775805)
415; CHECK-NEXT:    %r = getelementptr i8, ptr %s
416; CHECK-NEXT:    --> @constant U: [0,-3) S: [-9223372036854775808,9223372036854775805)
417; CHECK-NEXT:  Determining loop execution counts for: @tautological_select
418;
419  %s = select i1 true, ptr @constant, ptr @another_constant
420  %r = getelementptr i8, ptr %s
421  ret ptr %r
422}
423
424define ptr @tautological_select_like_phi(i32 %tc) {
425; CHECK-LABEL: 'tautological_select_like_phi'
426; CHECK-NEXT:  Classifying expressions for: @tautological_select_like_phi
427; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]
428; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,101) S: [0,101) Exits: 100 LoopDispositions: { %loop: Computable }
429; CHECK-NEXT:    %r = phi ptr [ @constant, %truebb ], [ @another_constant, %falsebb ]
430; CHECK-NEXT:    --> @constant U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: @constant LoopDispositions: { %loop: Invariant }
431; CHECK-NEXT:    %iv.next = add i32 %iv, 1
432; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,102) S: [1,102) Exits: 101 LoopDispositions: { %loop: Computable }
433; CHECK-NEXT:  Determining loop execution counts for: @tautological_select_like_phi
434; CHECK-NEXT:  Loop %loop: backedge-taken count is i32 100
435; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 100
436; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 100
437; CHECK-NEXT:  Loop %loop: Trip multiple is 101
438;
439entry:
440  br label %loop
441
442loop:
443  %iv = phi i32[ 0, %entry ], [ %iv.next, %latch ]
444  br i1 true, label %truebb, label %falsebb
445
446truebb:
447  br label %latch
448
449falsebb:
450  br label %latch
451
452latch:
453  %r = phi ptr [ @constant, %truebb], [ @another_constant, %falsebb]
454  %iv.next = add i32 %iv, 1
455  %done = icmp eq i32 %iv, 100
456  br i1 %done, label %end, label %loop
457
458end:
459  ret ptr %r
460}
461
462define i32 @umin_seq_x_y(i32 %x, i32 %y) {
463; CHECK-LABEL: 'umin_seq_x_y'
464; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y
465; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
466; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
467; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
468; CHECK-NEXT:    --> (%x umin_seq %y) U: full-set S: full-set
469; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y
470;
471  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
472  %x.is.zero = icmp eq i32 %x, 0
473  %r = select i1 %x.is.zero, i32 0, i32 %umin
474  ret i32 %r
475}
476
477define i32 @umin_seq_x_y_tautological(i32 %x, i32 %y) {
478; CHECK-LABEL: 'umin_seq_x_y_tautological'
479; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_tautological
480; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
481; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
482; CHECK-NEXT:    %r = select i1 %umin.is.zero, i32 0, i32 %umin
483; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
484; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_tautological
485;
486  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
487  %umin.is.zero = icmp eq i32 %umin, 0
488  %r = select i1 %umin.is.zero, i32 0, i32 %umin
489  ret i32 %r
490}
491define i32 @umin_seq_x_y_tautological_wrongtype(i32 %x, i32 %y) {
492; CHECK-LABEL: 'umin_seq_x_y_tautological_wrongtype'
493; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_tautological_wrongtype
494; CHECK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %y, i32 %x)
495; CHECK-NEXT:    --> (%x umax %y) U: full-set S: full-set
496; CHECK-NEXT:    %r = select i1 %umax.is.zero, i32 0, i32 %umax
497; CHECK-NEXT:    --> (%x umax %y) U: full-set S: full-set
498; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_tautological_wrongtype
499;
500  %umax = call i32 @llvm.umax(i32 %y, i32 %x)
501  %umax.is.zero = icmp eq i32 %umax, 0
502  %r = select i1 %umax.is.zero, i32 0, i32 %umax
503  ret i32 %r
504}
505
506define i32 @umin_seq_x_y_wrongtype0(i32 %x, i32 %y) {
507; CHECK-LABEL: 'umin_seq_x_y_wrongtype0'
508; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_wrongtype0
509; CHECK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %y, i32 %x)
510; CHECK-NEXT:    --> (%x umax %y) U: full-set S: full-set
511; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umax
512; CHECK-NEXT:    --> %r U: full-set S: full-set
513; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_wrongtype0
514;
515  %umax = call i32 @llvm.umax(i32 %y, i32 %x)
516  %x.is.zero = icmp eq i32 %x, 0
517  %r = select i1 %x.is.zero, i32 0, i32 %umax
518  ret i32 %r
519}
520define i32 @umin_seq_x_y_wrongtype1(i32 %x, i32 %y) {
521; CHECK-LABEL: 'umin_seq_x_y_wrongtype1'
522; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_wrongtype1
523; CHECK-NEXT:    %smax = call i32 @llvm.smax.i32(i32 %y, i32 %x)
524; CHECK-NEXT:    --> (%x smax %y) U: full-set S: full-set
525; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %smax
526; CHECK-NEXT:    --> %r U: full-set S: full-set
527; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_wrongtype1
528;
529  %smax = call i32 @llvm.smax(i32 %y, i32 %x)
530  %x.is.zero = icmp eq i32 %x, 0
531  %r = select i1 %x.is.zero, i32 0, i32 %smax
532  ret i32 %r
533}
534define i32 @umin_seq_x_y_wrongtype2(i32 %x, i32 %y) {
535; CHECK-LABEL: 'umin_seq_x_y_wrongtype2'
536; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_wrongtype2
537; CHECK-NEXT:    %smin = call i32 @llvm.smin.i32(i32 %y, i32 %x)
538; CHECK-NEXT:    --> (%x smin %y) U: full-set S: full-set
539; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %smin
540; CHECK-NEXT:    --> %r U: full-set S: full-set
541; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_wrongtype2
542;
543  %smin = call i32 @llvm.smin(i32 %y, i32 %x)
544  %x.is.zero = icmp eq i32 %x, 0
545  %r = select i1 %x.is.zero, i32 0, i32 %smin
546  ret i32 %r
547}
548
549define i32 @umin_seq_x_y_wrongtype3(i32 %x, i32 %y, i32 %z) {
550; CHECK-LABEL: 'umin_seq_x_y_wrongtype3'
551; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_wrongtype3
552; CHECK-NEXT:    %umax = call i32 @llvm.umax.i32(i32 %x, i32 %z)
553; CHECK-NEXT:    --> (%x umax %z) U: full-set S: full-set
554; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %umax, i32 %y)
555; CHECK-NEXT:    --> ((%x umax %z) umin %y) U: full-set S: full-set
556; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
557; CHECK-NEXT:    --> %r U: full-set S: full-set
558; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_wrongtype3
559;
560  %umax = call i32 @llvm.umax(i32 %x, i32 %z)
561  %umin = call i32 @llvm.umin(i32 %umax, i32 %y)
562  %x.is.zero = icmp eq i32 %x, 0
563  %r = select i1 %x.is.zero, i32 0, i32 %umin
564  ret i32 %r
565}
566
567define i32 @umin_seq_y_x(i32 %x, i32 %y) {
568; CHECK-LABEL: 'umin_seq_y_x'
569; CHECK-NEXT:  Classifying expressions for: @umin_seq_y_x
570; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %x, i32 %y)
571; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
572; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
573; CHECK-NEXT:    --> (%y umin_seq %x) U: full-set S: full-set
574; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_y_x
575;
576  %umin = call i32 @llvm.umin(i32 %x, i32 %y)
577  %x.is.zero = icmp eq i32 %y, 0
578  %r = select i1 %x.is.zero, i32 0, i32 %umin
579  ret i32 %r
580}
581
582define i32 @umin_seq_x_x_y_z(i32 %x, i32 %y, i32 %z) {
583; CHECK-LABEL: 'umin_seq_x_x_y_z'
584; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_x_y_z
585; CHECK-NEXT:    %umin0 = call i32 @llvm.umin.i32(i32 %z, i32 %x)
586; CHECK-NEXT:    --> (%x umin %z) U: full-set S: full-set
587; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %umin0, i32 %y)
588; CHECK-NEXT:    --> (%x umin %y umin %z) U: full-set S: full-set
589; CHECK-NEXT:    %r0 = select i1 %x.is.zero, i32 0, i32 %umin
590; CHECK-NEXT:    --> (%x umin_seq (%y umin %z)) U: full-set S: full-set
591; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %r0
592; CHECK-NEXT:    --> (%x umin_seq (%y umin %z)) U: full-set S: full-set
593; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_x_y_z
594;
595  %umin0 = call i32 @llvm.umin(i32 %z, i32 %x)
596  %umin = call i32 @llvm.umin(i32 %umin0, i32 %y)
597  %x.is.zero = icmp eq i32 %x, 0
598  %r0 = select i1 %x.is.zero, i32 0, i32 %umin
599  %r = select i1 %x.is.zero, i32 0, i32 %r0
600  ret i32 %r
601}
602
603define i32 @umin_seq_x_y_z(i32 %x, i32 %y, i32 %z) {
604; CHECK-LABEL: 'umin_seq_x_y_z'
605; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_z
606; CHECK-NEXT:    %umin0 = call i32 @llvm.umin.i32(i32 %z, i32 %x)
607; CHECK-NEXT:    --> (%x umin %z) U: full-set S: full-set
608; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %umin0, i32 %y)
609; CHECK-NEXT:    --> (%x umin %y umin %z) U: full-set S: full-set
610; CHECK-NEXT:    %r0 = select i1 %y.is.zero, i32 0, i32 %umin
611; CHECK-NEXT:    --> (%y umin_seq (%x umin %z)) U: full-set S: full-set
612; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %r0
613; CHECK-NEXT:    --> (%x umin_seq %y umin_seq %z) U: full-set S: full-set
614; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_z
615;
616  %umin0 = call i32 @llvm.umin(i32 %z, i32 %x)
617  %umin = call i32 @llvm.umin(i32 %umin0, i32 %y)
618  %x.is.zero = icmp eq i32 %x, 0
619  %y.is.zero = icmp eq i32 %y, 0
620  %r0 = select i1 %y.is.zero, i32 0, i32 %umin
621  %r = select i1 %x.is.zero, i32 0, i32 %r0
622  ret i32 %r
623}
624
625define i32 @umin_seq_a_b_c_d(i32 %a, i32 %b, i32 %c, i32 %d) {
626; CHECK-LABEL: 'umin_seq_a_b_c_d'
627; CHECK-NEXT:  Classifying expressions for: @umin_seq_a_b_c_d
628; CHECK-NEXT:    %umin1 = call i32 @llvm.umin.i32(i32 %c, i32 %d)
629; CHECK-NEXT:    --> (%c umin %d) U: full-set S: full-set
630; CHECK-NEXT:    %r1 = select i1 %c.is.zero, i32 0, i32 %umin1
631; CHECK-NEXT:    --> (%c umin_seq %d) U: full-set S: full-set
632; CHECK-NEXT:    %umin0 = call i32 @llvm.umin.i32(i32 %a, i32 %b)
633; CHECK-NEXT:    --> (%a umin %b) U: full-set S: full-set
634; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %umin0, i32 %r1)
635; CHECK-NEXT:    --> ((%c umin_seq %d) umin %a umin %b) U: full-set S: full-set
636; CHECK-NEXT:    %r = select i1 %d.is.zero, i32 0, i32 %umin
637; CHECK-NEXT:    --> (%d umin_seq (%a umin %b umin %c)) U: full-set S: full-set
638; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_a_b_c_d
639;
640  %umin1 = call i32 @llvm.umin(i32 %c, i32 %d)
641  %c.is.zero = icmp eq i32 %c, 0
642  %r1 = select i1 %c.is.zero, i32 0, i32 %umin1
643
644  %umin0 = call i32 @llvm.umin(i32 %a, i32 %b)
645  %umin = call i32 @llvm.umin(i32 %umin0, i32 %r1)
646  %d.is.zero = icmp eq i32 %d, 0
647  %r = select i1 %d.is.zero, i32 0, i32 %umin
648  ret i32 %r
649}
650
651define i32 @umin_seq_x_y_zext_both(i8 %x.narrow, i32 %y) {
652; CHECK-LABEL: 'umin_seq_x_y_zext_both'
653; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_both
654; CHECK-NEXT:    %x = zext i8 %x.narrow to i32
655; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
656; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
657; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256)
658; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
659; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin_seq %y) U: [0,256) S: [0,256)
660; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_both
661;
662  %x = zext i8 %x.narrow to i32
663  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
664  %x.is.zero = icmp eq i32 %x, 0
665  %r = select i1 %x.is.zero, i32 0, i32 %umin
666  ret i32 %r
667}
668
669define i32 @umin_seq_x_y_zext_in_umin(i8 %x.narrow, i32 %y) {
670; CHECK-LABEL: 'umin_seq_x_y_zext_in_umin'
671; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_in_umin
672; CHECK-NEXT:    %x = zext i8 %x.narrow to i32
673; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
674; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
675; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256)
676; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
677; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin_seq %y) U: [0,256) S: [0,256)
678; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_in_umin
679;
680  %x = zext i8 %x.narrow to i32
681  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
682  %x.is.zero = icmp eq i8 %x.narrow, 0
683  %r = select i1 %x.is.zero, i32 0, i32 %umin
684  ret i32 %r
685}
686
687define i8 @umin_seq_x_y_zext_in_iszero(i8 %x, i8 %y) {
688; CHECK-LABEL: 'umin_seq_x_y_zext_in_iszero'
689; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_in_iszero
690; CHECK-NEXT:    %x.wide = zext i8 %x to i32
691; CHECK-NEXT:    --> (zext i8 %x to i32) U: [0,256) S: [0,256)
692; CHECK-NEXT:    %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
693; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
694; CHECK-NEXT:    %r = select i1 %x.is.zero, i8 0, i8 %umin
695; CHECK-NEXT:    --> (%x umin_seq %y) U: full-set S: full-set
696; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_in_iszero
697;
698  %x.wide = zext i8 %x to i32
699  %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
700  %x.is.zero = icmp eq i32 %x.wide, 0
701  %r = select i1 %x.is.zero, i8 0, i8 %umin
702  ret i8 %r
703}
704
705define i32 @umin_seq_x_y_zext_of_umin(i8 %x, i8 %y) {
706; CHECK-LABEL: 'umin_seq_x_y_zext_of_umin'
707; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_of_umin
708; CHECK-NEXT:    %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
709; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
710; CHECK-NEXT:    %umin = zext i8 %umin.narrow to i32
711; CHECK-NEXT:    --> ((zext i8 %x to i32) umin (zext i8 %y to i32)) U: [0,256) S: [0,256)
712; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
713; CHECK-NEXT:    --> ((zext i8 %x to i32) umin_seq (zext i8 %y to i32)) U: [0,256) S: [0,256)
714; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_of_umin
715;
716  %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
717  %umin = zext i8 %umin.narrow to i32
718  %x.is.zero = icmp eq i8 %x, 0
719  %r = select i1 %x.is.zero, i32 0, i32 %umin
720  ret i32 %r
721}
722
723define i32 @umin_seq_x_y_sext_both(i8 %x.narrow, i32 %y) {
724; CHECK-LABEL: 'umin_seq_x_y_sext_both'
725; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_both
726; CHECK-NEXT:    %x = sext i8 %x.narrow to i32
727; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
728; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
729; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set
730; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
731; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin_seq %y) U: full-set S: full-set
732; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_both
733;
734  %x = sext i8 %x.narrow to i32
735  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
736  %x.is.zero = icmp eq i32 %x, 0
737  %r = select i1 %x.is.zero, i32 0, i32 %umin
738  ret i32 %r
739}
740
741define i32 @umin_seq_x_y_sext_in_umin(i8 %x.narrow, i32 %y) {
742; CHECK-LABEL: 'umin_seq_x_y_sext_in_umin'
743; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_in_umin
744; CHECK-NEXT:    %x = sext i8 %x.narrow to i32
745; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
746; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
747; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set
748; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
749; CHECK-NEXT:    --> %r U: full-set S: full-set
750; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_in_umin
751;
752  %x = sext i8 %x.narrow to i32
753  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
754  %x.is.zero = icmp eq i8 %x.narrow, 0
755  %r = select i1 %x.is.zero, i32 0, i32 %umin
756  ret i32 %r
757}
758
759define i8 @umin_seq_x_y_sext_in_iszero(i8 %x, i8 %y) {
760; CHECK-LABEL: 'umin_seq_x_y_sext_in_iszero'
761; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_in_iszero
762; CHECK-NEXT:    %x.wide = sext i8 %x to i32
763; CHECK-NEXT:    --> (sext i8 %x to i32) U: [-128,128) S: [-128,128)
764; CHECK-NEXT:    %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
765; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
766; CHECK-NEXT:    %r = select i1 %x.is.zero, i8 0, i8 %umin
767; CHECK-NEXT:    --> %r U: full-set S: full-set
768; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_in_iszero
769;
770  %x.wide = sext i8 %x to i32
771  %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
772  %x.is.zero = icmp eq i32 %x.wide, 0
773  %r = select i1 %x.is.zero, i8 0, i8 %umin
774  ret i8 %r
775}
776
777define i32 @umin_seq_x_y_sext_of_umin(i8 %x, i8 %y) {
778; CHECK-LABEL: 'umin_seq_x_y_sext_of_umin'
779; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_of_umin
780; CHECK-NEXT:    %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
781; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
782; CHECK-NEXT:    %umin = sext i8 %umin.narrow to i32
783; CHECK-NEXT:    --> (sext i8 (%x umin %y) to i32) U: [-128,128) S: [-128,128)
784; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
785; CHECK-NEXT:    --> %r U: [-128,128) S: [-128,128)
786; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_of_umin
787;
788  %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
789  %umin = sext i8 %umin.narrow to i32
790  %x.is.zero = icmp eq i8 %x, 0
791  %r = select i1 %x.is.zero, i32 0, i32 %umin
792  ret i32 %r
793}
794
795define i32 @umin_seq_x_y_zext_vs_sext(i8 %x.narrow, i32 %y) {
796; CHECK-LABEL: 'umin_seq_x_y_zext_vs_sext'
797; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_vs_sext
798; CHECK-NEXT:    %x.zext = zext i8 %x.narrow to i32
799; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
800; CHECK-NEXT:    %x.sext = sext i8 %x.narrow to i32
801; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
802; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x.zext)
803; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256)
804; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
805; CHECK-NEXT:    --> %r U: [0,256) S: [0,256)
806; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_vs_sext
807;
808  %x.zext = zext i8 %x.narrow to i32
809  %x.sext = sext i8 %x.narrow to i32
810  %umin = call i32 @llvm.umin(i32 %y, i32 %x.zext)
811  %x.is.zero = icmp eq i32 %x.sext, 0
812  %r = select i1 %x.is.zero, i32 0, i32 %umin
813  ret i32 %r
814}
815define i32 @umin_seq_x_y_sext_vs_zext(i8 %x.narrow, i32 %y) {
816; CHECK-LABEL: 'umin_seq_x_y_sext_vs_zext'
817; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_vs_zext
818; CHECK-NEXT:    %x.zext = zext i8 %x.narrow to i32
819; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
820; CHECK-NEXT:    %x.sext = sext i8 %x.narrow to i32
821; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
822; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x.sext)
823; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set
824; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
825; CHECK-NEXT:    --> %r U: full-set S: full-set
826; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_vs_zext
827;
828  %x.zext = zext i8 %x.narrow to i32
829  %x.sext = sext i8 %x.narrow to i32
830  %umin = call i32 @llvm.umin(i32 %y, i32 %x.sext)
831  %x.is.zero = icmp eq i32 %x.zext, 0
832  %r = select i1 %x.is.zero, i32 0, i32 %umin
833  ret i32 %r
834}
835
836define i32 @select_x_or_zero_expanded(i1 %c, i32 %x) {
837; CHECK-LABEL: 'select_x_or_zero_expanded'
838; CHECK-NEXT:  Classifying expressions for: @select_x_or_zero_expanded
839; CHECK-NEXT:    %c.splat = sext i1 %c to i32
840; CHECK-NEXT:    --> (sext i1 %c to i32) U: [-1,1) S: [-1,1)
841; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c.splat, i32 %x)
842; CHECK-NEXT:    --> ((sext i1 %c to i32) umin %x) U: full-set S: full-set
843; CHECK-NEXT:    %r = select i1 %v0.is.zero, i32 0, i32 %umin
844; CHECK-NEXT:    --> ((sext i1 %c to i32) umin_seq %x) U: full-set S: full-set
845; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_zero_expanded
846;
847  %c.splat = sext i1 %c to i32
848  %umin = call i32 @llvm.umin(i32 %c.splat, i32 %x)
849  %v0.is.zero = icmp eq i32 %c.splat, 0
850  %r = select i1 %v0.is.zero, i32 0, i32 %umin
851  ret i32 %r
852}
853
854define i32 @select_zero_or_x_expanded(i1 %c, i32 %y) {
855; CHECK-LABEL: 'select_zero_or_x_expanded'
856; CHECK-NEXT:  Classifying expressions for: @select_zero_or_x_expanded
857; CHECK-NEXT:    %c.splat = sext i1 %c to i32
858; CHECK-NEXT:    --> (sext i1 %c to i32) U: [-1,1) S: [-1,1)
859; CHECK-NEXT:    %c.splat.not = xor i32 %c.splat, -1
860; CHECK-NEXT:    --> (-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> U: [-1,1) S: [-1,1)
861; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c.splat.not, i32 %y)
862; CHECK-NEXT:    --> ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin %y) U: full-set S: full-set
863; CHECK-NEXT:    %r = select i1 %v0.is.zero, i32 0, i32 %umin
864; CHECK-NEXT:    --> ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin_seq %y) U: full-set S: full-set
865; CHECK-NEXT:  Determining loop execution counts for: @select_zero_or_x_expanded
866;
867  %c.splat = sext i1 %c to i32
868  %c.splat.not = xor i32 %c.splat, -1
869  %umin = call i32 @llvm.umin(i32 %c.splat.not, i32 %y)
870  %v0.is.zero = icmp eq i32 %c.splat.not, 0
871  %r = select i1 %v0.is.zero, i32 0, i32 %umin
872  ret i32 %r
873}
874define i32 @select_zero_or_x_expanded2(i1 %c, i32 %y) {
875; CHECK-LABEL: 'select_zero_or_x_expanded2'
876; CHECK-NEXT:  Classifying expressions for: @select_zero_or_x_expanded2
877; CHECK-NEXT:    %c.not = xor i1 %c, true
878; CHECK-NEXT:    --> (true + %c) U: full-set S: full-set
879; CHECK-NEXT:    %c.not.splat = sext i1 %c.not to i32
880; CHECK-NEXT:    --> (sext i1 (true + %c) to i32) U: [-1,1) S: [-1,1)
881; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c.not.splat, i32 %y)
882; CHECK-NEXT:    --> ((sext i1 (true + %c) to i32) umin %y) U: full-set S: full-set
883; CHECK-NEXT:    %r = select i1 %v0.is.zero, i32 0, i32 %umin
884; CHECK-NEXT:    --> ((sext i1 (true + %c) to i32) umin_seq %y) U: full-set S: full-set
885; CHECK-NEXT:  Determining loop execution counts for: @select_zero_or_x_expanded2
886;
887  %c.not = xor i1 %c, -1
888  %c.not.splat = sext i1 %c.not to i32
889  %umin = call i32 @llvm.umin(i32 %c.not.splat, i32 %y)
890  %v0.is.zero = icmp eq i32 %c.not.splat, 0
891  %r = select i1 %v0.is.zero, i32 0, i32 %umin
892  ret i32 %r
893}
894
895define i32 @select_x_or_constant_expanded(i1 %c, i32 %x) {
896; CHECK-LABEL: 'select_x_or_constant_expanded'
897; CHECK-NEXT:  Classifying expressions for: @select_x_or_constant_expanded
898; CHECK-NEXT:    %c.splat = sext i1 %c to i32
899; CHECK-NEXT:    --> (sext i1 %c to i32) U: [-1,1) S: [-1,1)
900; CHECK-NEXT:    %x.off = sub i32 %x, 42
901; CHECK-NEXT:    --> (-42 + %x) U: full-set S: full-set
902; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c.splat, i32 %x.off)
903; CHECK-NEXT:    --> ((sext i1 %c to i32) umin (-42 + %x)) U: full-set S: full-set
904; CHECK-NEXT:    %r.off = select i1 %v0.is.zero, i32 0, i32 %umin
905; CHECK-NEXT:    --> ((sext i1 %c to i32) umin_seq (-42 + %x)) U: full-set S: full-set
906; CHECK-NEXT:    %r = add i32 %r.off, 42
907; CHECK-NEXT:    --> (42 + ((sext i1 %c to i32) umin_seq (-42 + %x))) U: full-set S: full-set
908; CHECK-NEXT:  Determining loop execution counts for: @select_x_or_constant_expanded
909;
910  %c.splat = sext i1 %c to i32
911  %x.off = sub i32 %x, 42
912  %umin = call i32 @llvm.umin(i32 %c.splat, i32 %x.off)
913  %v0.is.zero = icmp eq i32 %c.splat, 0
914  %r.off = select i1 %v0.is.zero, i32 0, i32 %umin
915  %r = add i32 %r.off, 42
916  ret i32 %r
917}
918
919define i32 @select_constant_or_y_expanded(i1 %c, i32 %y) {
920; CHECK-LABEL: 'select_constant_or_y_expanded'
921; CHECK-NEXT:  Classifying expressions for: @select_constant_or_y_expanded
922; CHECK-NEXT:    %c.splat = sext i1 %c to i32
923; CHECK-NEXT:    --> (sext i1 %c to i32) U: [-1,1) S: [-1,1)
924; CHECK-NEXT:    %c.splat.not = xor i32 %c.splat, -1
925; CHECK-NEXT:    --> (-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> U: [-1,1) S: [-1,1)
926; CHECK-NEXT:    %y.off = sub i32 %y, 42
927; CHECK-NEXT:    --> (-42 + %y) U: full-set S: full-set
928; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c.splat.not, i32 %y.off)
929; CHECK-NEXT:    --> ((-42 + %y) umin (-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw>) U: full-set S: full-set
930; CHECK-NEXT:    %r.off = select i1 %v0.is.zero, i32 0, i32 %umin
931; CHECK-NEXT:    --> ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin_seq (-42 + %y)) U: full-set S: full-set
932; CHECK-NEXT:    %r = add i32 %r.off, 42
933; CHECK-NEXT:    --> (42 + ((-1 + (-1 * (sext i1 %c to i32))<nsw>)<nsw> umin_seq (-42 + %y))) U: full-set S: full-set
934; CHECK-NEXT:  Determining loop execution counts for: @select_constant_or_y_expanded
935;
936  %c.splat = sext i1 %c to i32
937  %c.splat.not = xor i32 %c.splat, -1
938  %y.off = sub i32 %y, 42
939  %umin = call i32 @llvm.umin(i32 %c.splat.not, i32 %y.off)
940  %v0.is.zero = icmp eq i32 %c.splat.not, 0
941  %r.off = select i1 %v0.is.zero, i32 0, i32 %umin
942  %r = add i32 %r.off, 42
943  ret i32 %r
944}
945
946declare i8 @llvm.umin.i8(i8, i8)
947declare i8 @llvm.umax.i8(i8, i8)
948declare i8 @llvm.smin.i8(i8, i8)
949declare i8 @llvm.smax.i8(i8, i8)
950
951declare i32 @llvm.umin(i32, i32)
952declare i32 @llvm.umax(i32, i32)
953declare i32 @llvm.smin(i32, i32)
954declare i32 @llvm.smax(i32, i32)
955