xref: /llvm-project/llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll (revision 3bf2295ee0ebd1eafe66ca15dff44bdb31e6198a)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4; This is a specialization of generic folds for min/max values targeted to the
5; 'null' ptr constant.
6; Related tests for non-pointer types should be included in another file.
7
8; There are 6 basic patterns (or 3 with DeMorganized equivalent) with
9;    2 (commute logic op) *
10;    2 (swap compare operands) *
11; variations for a total of 24 tests.
12
13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14;
15; (X == null) && (X > Y) --> false
16;
17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18
19define i1 @ugt_and_min(ptr %x, ptr %y)  {
20; CHECK-LABEL: @ugt_and_min(
21; CHECK-NEXT:    ret i1 false
22;
23  %cmp = icmp ugt ptr %x, %y
24  %cmpeq = icmp eq ptr %x, null
25  %r = and i1 %cmp, %cmpeq
26  ret i1 %r
27}
28
29define i1 @ugt_and_min_logical(ptr %x, ptr %y)  {
30; CHECK-LABEL: @ugt_and_min_logical(
31; CHECK-NEXT:    ret i1 false
32;
33  %cmp = icmp ugt ptr %x, %y
34  %cmpeq = icmp eq ptr %x, null
35  %r = select i1 %cmp, i1 %cmpeq, i1 false
36  ret i1 %r
37}
38
39define i1 @ugt_and_min_commute(ptr %x, ptr %y)  {
40; CHECK-LABEL: @ugt_and_min_commute(
41; CHECK-NEXT:    ret i1 false
42;
43  %cmp = icmp ugt ptr %x, %y
44  %cmpeq = icmp eq ptr %x, null
45  %r = and i1 %cmpeq, %cmp
46  ret i1 %r
47}
48
49define i1 @ugt_and_min_commute_logical(ptr %x, ptr %y)  {
50; CHECK-LABEL: @ugt_and_min_commute_logical(
51; CHECK-NEXT:    ret i1 false
52;
53  %cmp = icmp ugt ptr %x, %y
54  %cmpeq = icmp eq ptr %x, null
55  %r = select i1 %cmpeq, i1 %cmp, i1 false
56  ret i1 %r
57}
58
59define i1 @ugt_swap_and_min(ptr %x, ptr %y)  {
60; CHECK-LABEL: @ugt_swap_and_min(
61; CHECK-NEXT:    ret i1 false
62;
63  %cmp = icmp ult ptr %y, %x
64  %cmpeq = icmp eq ptr %x, null
65  %r = and i1 %cmp, %cmpeq
66  ret i1 %r
67}
68
69define i1 @ugt_swap_and_min_logical(ptr %x, ptr %y)  {
70; CHECK-LABEL: @ugt_swap_and_min_logical(
71; CHECK-NEXT:    ret i1 false
72;
73  %cmp = icmp ult ptr %y, %x
74  %cmpeq = icmp eq ptr %x, null
75  %r = select i1 %cmp, i1 %cmpeq, i1 false
76  ret i1 %r
77}
78
79define i1 @ugt_swap_and_min_commute(ptr %x, ptr %y)  {
80; CHECK-LABEL: @ugt_swap_and_min_commute(
81; CHECK-NEXT:    ret i1 false
82;
83  %cmp = icmp ult ptr %y, %x
84  %cmpeq = icmp eq ptr %x, null
85  %r = and i1 %cmpeq, %cmp
86  ret i1 %r
87}
88
89define i1 @ugt_swap_and_min_commute_logical(ptr %x, ptr %y)  {
90; CHECK-LABEL: @ugt_swap_and_min_commute_logical(
91; CHECK-NEXT:    ret i1 false
92;
93  %cmp = icmp ult ptr %y, %x
94  %cmpeq = icmp eq ptr %x, null
95  %r = select i1 %cmpeq, i1 %cmp, i1 false
96  ret i1 %r
97}
98
99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
100;
101; (X != null) || (X <= Y) --> true
102;
103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104
105define i1 @ule_or_not_min(ptr %x, ptr %y)  {
106; CHECK-LABEL: @ule_or_not_min(
107; CHECK-NEXT:    ret i1 true
108;
109  %cmp = icmp ule ptr %x, %y
110  %cmpeq = icmp ne ptr %x, null
111  %r = or i1 %cmp, %cmpeq
112  ret i1 %r
113}
114
115define i1 @ule_or_not_min_logical(ptr %x, ptr %y)  {
116; CHECK-LABEL: @ule_or_not_min_logical(
117; CHECK-NEXT:    ret i1 true
118;
119  %cmp = icmp ule ptr %x, %y
120  %cmpeq = icmp ne ptr %x, null
121  %r = select i1 %cmp, i1 true, i1 %cmpeq
122  ret i1 %r
123}
124
125define i1 @ule_or_not_min_commute(ptr %x, ptr %y)  {
126; CHECK-LABEL: @ule_or_not_min_commute(
127; CHECK-NEXT:    ret i1 true
128;
129  %cmp = icmp ule ptr %x, %y
130  %cmpeq = icmp ne ptr %x, null
131  %r = or i1 %cmpeq, %cmp
132  ret i1 %r
133}
134
135define i1 @ule_or_not_min_commute_logical(ptr %x, ptr %y)  {
136; CHECK-LABEL: @ule_or_not_min_commute_logical(
137; CHECK-NEXT:    ret i1 true
138;
139  %cmp = icmp ule ptr %x, %y
140  %cmpeq = icmp ne ptr %x, null
141  %r = select i1 %cmpeq, i1 true, i1 %cmp
142  ret i1 %r
143}
144
145define i1 @ule_swap_or_not_min(ptr %x, ptr %y)  {
146; CHECK-LABEL: @ule_swap_or_not_min(
147; CHECK-NEXT:    ret i1 true
148;
149  %cmp = icmp uge ptr %y, %x
150  %cmpeq = icmp ne ptr %x, null
151  %r = or i1 %cmp, %cmpeq
152  ret i1 %r
153}
154
155define i1 @ule_swap_or_not_min_logical(ptr %x, ptr %y)  {
156; CHECK-LABEL: @ule_swap_or_not_min_logical(
157; CHECK-NEXT:    ret i1 true
158;
159  %cmp = icmp uge ptr %y, %x
160  %cmpeq = icmp ne ptr %x, null
161  %r = select i1 %cmp, i1 true, i1 %cmpeq
162  ret i1 %r
163}
164
165define i1 @ule_swap_or_not_min_commute(ptr %x, ptr %y)  {
166; CHECK-LABEL: @ule_swap_or_not_min_commute(
167; CHECK-NEXT:    ret i1 true
168;
169  %cmp = icmp uge ptr %y, %x
170  %cmpeq = icmp ne ptr %x, null
171  %r = or i1 %cmpeq, %cmp
172  ret i1 %r
173}
174
175define i1 @ule_swap_or_not_min_commute_logical(ptr %x, ptr %y)  {
176; CHECK-LABEL: @ule_swap_or_not_min_commute_logical(
177; CHECK-NEXT:    ret i1 true
178;
179  %cmp = icmp uge ptr %y, %x
180  %cmpeq = icmp ne ptr %x, null
181  %r = select i1 %cmpeq, i1 true, i1 %cmp
182  ret i1 %r
183}
184
185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
186;
187; (X == null) && (X <= Y) --> X == null
188;
189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
190
191define i1 @ule_and_min(ptr %x, ptr %y)  {
192; CHECK-LABEL: @ule_and_min(
193; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
194; CHECK-NEXT:    ret i1 [[CMPEQ]]
195;
196  %cmp = icmp ule ptr %x, %y
197  %cmpeq = icmp eq ptr %x, null
198  %r = and i1 %cmp, %cmpeq
199  ret i1 %r
200}
201
202define i1 @ule_and_min_logical(ptr %x, ptr %y)  {
203; CHECK-LABEL: @ule_and_min_logical(
204; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
205; CHECK-NEXT:    ret i1 [[CMPEQ]]
206;
207  %cmp = icmp ule ptr %x, %y
208  %cmpeq = icmp eq ptr %x, null
209  %r = select i1 %cmp, i1 %cmpeq, i1 false
210  ret i1 %r
211}
212
213define i1 @ule_and_min_commute(ptr %x, ptr %y)  {
214; CHECK-LABEL: @ule_and_min_commute(
215; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
216; CHECK-NEXT:    ret i1 [[CMPEQ]]
217;
218  %cmp = icmp ule ptr %x, %y
219  %cmpeq = icmp eq ptr %x, null
220  %r = and i1 %cmpeq, %cmp
221  ret i1 %r
222}
223
224define i1 @ule_and_min_commute_logical(ptr %x, ptr %y)  {
225; CHECK-LABEL: @ule_and_min_commute_logical(
226; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
227; CHECK-NEXT:    ret i1 [[CMPEQ]]
228;
229  %cmp = icmp ule ptr %x, %y
230  %cmpeq = icmp eq ptr %x, null
231  %r = select i1 %cmpeq, i1 %cmp, i1 false
232  ret i1 %r
233}
234
235define i1 @ule_swap_and_min(ptr %x, ptr %y)  {
236; CHECK-LABEL: @ule_swap_and_min(
237; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
238; CHECK-NEXT:    ret i1 [[CMPEQ]]
239;
240  %cmp = icmp uge ptr %y, %x
241  %cmpeq = icmp eq ptr %x, null
242  %r = and i1 %cmp, %cmpeq
243  ret i1 %r
244}
245
246define i1 @ule_swap_and_min_logical(ptr %x, ptr %y)  {
247; CHECK-LABEL: @ule_swap_and_min_logical(
248; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
249; CHECK-NEXT:    ret i1 [[CMPEQ]]
250;
251  %cmp = icmp uge ptr %y, %x
252  %cmpeq = icmp eq ptr %x, null
253  %r = select i1 %cmp, i1 %cmpeq, i1 false
254  ret i1 %r
255}
256
257define i1 @ule_swap_and_min_commute(ptr %x, ptr %y)  {
258; CHECK-LABEL: @ule_swap_and_min_commute(
259; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
260; CHECK-NEXT:    ret i1 [[CMPEQ]]
261;
262  %cmp = icmp uge ptr %y, %x
263  %cmpeq = icmp eq ptr %x, null
264  %r = and i1 %cmpeq, %cmp
265  ret i1 %r
266}
267
268define i1 @ule_swap_and_min_commute_logical(ptr %x, ptr %y)  {
269; CHECK-LABEL: @ule_swap_and_min_commute_logical(
270; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
271; CHECK-NEXT:    ret i1 [[CMPEQ]]
272;
273  %cmp = icmp uge ptr %y, %x
274  %cmpeq = icmp eq ptr %x, null
275  %r = select i1 %cmpeq, i1 %cmp, i1 false
276  ret i1 %r
277}
278
279;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
280;
281; (X == null) || (X <= Y) --> X <= Y
282;
283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
284
285define i1 @ule_or_min(ptr %x, ptr %y)  {
286; CHECK-LABEL: @ule_or_min(
287; CHECK-NEXT:    [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]
288; CHECK-NEXT:    ret i1 [[CMP]]
289;
290  %cmp = icmp ule ptr %x, %y
291  %cmpeq = icmp eq ptr %x, null
292  %r = or i1 %cmp, %cmpeq
293  ret i1 %r
294}
295
296define i1 @ule_or_min_logical(ptr %x, ptr %y)  {
297; CHECK-LABEL: @ule_or_min_logical(
298; CHECK-NEXT:    [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]
299; CHECK-NEXT:    ret i1 [[CMP]]
300;
301  %cmp = icmp ule ptr %x, %y
302  %cmpeq = icmp eq ptr %x, null
303  %r = select i1 %cmp, i1 true, i1 %cmpeq
304  ret i1 %r
305}
306
307define i1 @ule_or_min_commute(ptr %x, ptr %y)  {
308; CHECK-LABEL: @ule_or_min_commute(
309; CHECK-NEXT:    [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]
310; CHECK-NEXT:    ret i1 [[CMP]]
311;
312  %cmp = icmp ule ptr %x, %y
313  %cmpeq = icmp eq ptr %x, null
314  %r = or i1 %cmpeq, %cmp
315  ret i1 %r
316}
317
318define i1 @ule_or_min_commute_logical(ptr %x, ptr %y)  {
319; CHECK-LABEL: @ule_or_min_commute_logical(
320; CHECK-NEXT:    [[CMP:%.*]] = icmp ule ptr [[X:%.*]], [[Y:%.*]]
321; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X]], null
322; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
323; CHECK-NEXT:    ret i1 [[R]]
324;
325  %cmp = icmp ule ptr %x, %y
326  %cmpeq = icmp eq ptr %x, null
327  %r = select i1 %cmpeq, i1 true, i1 %cmp
328  ret i1 %r
329}
330
331define i1 @ule_swap_or_min(ptr %x, ptr %y)  {
332; CHECK-LABEL: @ule_swap_or_min(
333; CHECK-NEXT:    [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]
334; CHECK-NEXT:    ret i1 [[CMP]]
335;
336  %cmp = icmp uge ptr %y, %x
337  %cmpeq = icmp eq ptr %x, null
338  %r = or i1 %cmp, %cmpeq
339  ret i1 %r
340}
341
342define i1 @ule_swap_or_min_logical(ptr %x, ptr %y)  {
343; CHECK-LABEL: @ule_swap_or_min_logical(
344; CHECK-NEXT:    [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]
345; CHECK-NEXT:    ret i1 [[CMP]]
346;
347  %cmp = icmp uge ptr %y, %x
348  %cmpeq = icmp eq ptr %x, null
349  %r = select i1 %cmp, i1 true, i1 %cmpeq
350  ret i1 %r
351}
352
353define i1 @ule_swap_or_min_commute(ptr %x, ptr %y)  {
354; CHECK-LABEL: @ule_swap_or_min_commute(
355; CHECK-NEXT:    [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]
356; CHECK-NEXT:    ret i1 [[CMP]]
357;
358  %cmp = icmp uge ptr %y, %x
359  %cmpeq = icmp eq ptr %x, null
360  %r = or i1 %cmpeq, %cmp
361  ret i1 %r
362}
363
364define i1 @ule_swap_or_min_commute_logical(ptr %x, ptr %y)  {
365; CHECK-LABEL: @ule_swap_or_min_commute_logical(
366; CHECK-NEXT:    [[CMP:%.*]] = icmp uge ptr [[Y:%.*]], [[X:%.*]]
367; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X]], null
368; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
369; CHECK-NEXT:    ret i1 [[R]]
370;
371  %cmp = icmp uge ptr %y, %x
372  %cmpeq = icmp eq ptr %x, null
373  %r = select i1 %cmpeq, i1 true, i1 %cmp
374  ret i1 %r
375}
376
377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
378;
379; (X != null) && (X > Y) --> X > Y
380;
381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
382
383define i1 @ugt_and_not_min(ptr %x, ptr %y)  {
384; CHECK-LABEL: @ugt_and_not_min(
385; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]
386; CHECK-NEXT:    ret i1 [[CMP]]
387;
388  %cmp = icmp ugt ptr %x, %y
389  %cmpeq = icmp ne ptr %x, null
390  %r = and i1 %cmp, %cmpeq
391  ret i1 %r
392}
393
394define i1 @ugt_and_not_min_logical(ptr %x, ptr %y)  {
395; CHECK-LABEL: @ugt_and_not_min_logical(
396; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]
397; CHECK-NEXT:    ret i1 [[CMP]]
398;
399  %cmp = icmp ugt ptr %x, %y
400  %cmpeq = icmp ne ptr %x, null
401  %r = select i1 %cmp, i1 %cmpeq, i1 false
402  ret i1 %r
403}
404
405define i1 @ugt_and_not_min_commute(ptr %x, ptr %y)  {
406; CHECK-LABEL: @ugt_and_not_min_commute(
407; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]
408; CHECK-NEXT:    ret i1 [[CMP]]
409;
410  %cmp = icmp ugt ptr %x, %y
411  %cmpeq = icmp ne ptr %x, null
412  %r = and i1 %cmpeq, %cmp
413  ret i1 %r
414}
415
416define i1 @ugt_and_not_min_commute_logical(ptr %x, ptr %y)  {
417; CHECK-LABEL: @ugt_and_not_min_commute_logical(
418; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt ptr [[X:%.*]], [[Y:%.*]]
419; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X]], null
420; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
421; CHECK-NEXT:    ret i1 [[R]]
422;
423  %cmp = icmp ugt ptr %x, %y
424  %cmpeq = icmp ne ptr %x, null
425  %r = select i1 %cmpeq, i1 %cmp, i1 false
426  ret i1 %r
427}
428
429define i1 @ugt_swap_and_not_min(ptr %x, ptr %y)  {
430; CHECK-LABEL: @ugt_swap_and_not_min(
431; CHECK-NEXT:    [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]
432; CHECK-NEXT:    ret i1 [[CMP]]
433;
434  %cmp = icmp ult ptr %y, %x
435  %cmpeq = icmp ne ptr %x, null
436  %r = and i1 %cmp, %cmpeq
437  ret i1 %r
438}
439
440define i1 @ugt_swap_and_not_min_logical(ptr %x, ptr %y)  {
441; CHECK-LABEL: @ugt_swap_and_not_min_logical(
442; CHECK-NEXT:    [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]
443; CHECK-NEXT:    ret i1 [[CMP]]
444;
445  %cmp = icmp ult ptr %y, %x
446  %cmpeq = icmp ne ptr %x, null
447  %r = select i1 %cmp, i1 %cmpeq, i1 false
448  ret i1 %r
449}
450
451define i1 @ugt_swap_and_not_min_commute(ptr %x, ptr %y)  {
452; CHECK-LABEL: @ugt_swap_and_not_min_commute(
453; CHECK-NEXT:    [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]
454; CHECK-NEXT:    ret i1 [[CMP]]
455;
456  %cmp = icmp ult ptr %y, %x
457  %cmpeq = icmp ne ptr %x, null
458  %r = and i1 %cmpeq, %cmp
459  ret i1 %r
460}
461
462define i1 @ugt_swap_and_not_min_commute_logical(ptr %x, ptr %y)  {
463; CHECK-LABEL: @ugt_swap_and_not_min_commute_logical(
464; CHECK-NEXT:    [[CMP:%.*]] = icmp ult ptr [[Y:%.*]], [[X:%.*]]
465; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X]], null
466; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
467; CHECK-NEXT:    ret i1 [[R]]
468;
469  %cmp = icmp ult ptr %y, %x
470  %cmpeq = icmp ne ptr %x, null
471  %r = select i1 %cmpeq, i1 %cmp, i1 false
472  ret i1 %r
473}
474
475;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
476;
477; (X != null) || (X > Y) --> X != null
478;
479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
480
481define i1 @ugt_or_not_min(ptr %x, ptr %y)  {
482; CHECK-LABEL: @ugt_or_not_min(
483; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
484; CHECK-NEXT:    ret i1 [[CMPEQ]]
485;
486  %cmp = icmp ugt ptr %x, %y
487  %cmpeq = icmp ne ptr %x, null
488  %r = or i1 %cmp, %cmpeq
489  ret i1 %r
490}
491
492define i1 @ugt_or_not_min_logical(ptr %x, ptr %y)  {
493; CHECK-LABEL: @ugt_or_not_min_logical(
494; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
495; CHECK-NEXT:    ret i1 [[CMPEQ]]
496;
497  %cmp = icmp ugt ptr %x, %y
498  %cmpeq = icmp ne ptr %x, null
499  %r = select i1 %cmp, i1 true, i1 %cmpeq
500  ret i1 %r
501}
502
503define i1 @ugt_or_not_min_commute(ptr %x, ptr %y)  {
504; CHECK-LABEL: @ugt_or_not_min_commute(
505; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
506; CHECK-NEXT:    ret i1 [[CMPEQ]]
507;
508  %cmp = icmp ugt ptr %x, %y
509  %cmpeq = icmp ne ptr %x, null
510  %r = or i1 %cmpeq, %cmp
511  ret i1 %r
512}
513
514define i1 @ugt_or_not_min_commute_logical(ptr %x, ptr %y)  {
515; CHECK-LABEL: @ugt_or_not_min_commute_logical(
516; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
517; CHECK-NEXT:    ret i1 [[CMPEQ]]
518;
519  %cmp = icmp ugt ptr %x, %y
520  %cmpeq = icmp ne ptr %x, null
521  %r = select i1 %cmpeq, i1 true, i1 %cmp
522  ret i1 %r
523}
524
525define i1 @ugt_swap_or_not_min(ptr %x, ptr %y)  {
526; CHECK-LABEL: @ugt_swap_or_not_min(
527; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
528; CHECK-NEXT:    ret i1 [[CMPEQ]]
529;
530  %cmp = icmp ult ptr %y, %x
531  %cmpeq = icmp ne ptr %x, null
532  %r = or i1 %cmp, %cmpeq
533  ret i1 %r
534}
535
536define i1 @ugt_swap_or_not_min_logical(ptr %x, ptr %y)  {
537; CHECK-LABEL: @ugt_swap_or_not_min_logical(
538; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
539; CHECK-NEXT:    ret i1 [[CMPEQ]]
540;
541  %cmp = icmp ult ptr %y, %x
542  %cmpeq = icmp ne ptr %x, null
543  %r = select i1 %cmp, i1 true, i1 %cmpeq
544  ret i1 %r
545}
546
547define i1 @ugt_swap_or_not_min_commute(ptr %x, ptr %y)  {
548; CHECK-LABEL: @ugt_swap_or_not_min_commute(
549; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
550; CHECK-NEXT:    ret i1 [[CMPEQ]]
551;
552  %cmp = icmp ult ptr %y, %x
553  %cmpeq = icmp ne ptr %x, null
554  %r = or i1 %cmpeq, %cmp
555  ret i1 %r
556}
557
558define i1 @ugt_swap_or_not_min_commute_logical(ptr %x, ptr %y)  {
559; CHECK-LABEL: @ugt_swap_or_not_min_commute_logical(
560; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
561; CHECK-NEXT:    ret i1 [[CMPEQ]]
562;
563  %cmp = icmp ult ptr %y, %x
564  %cmpeq = icmp ne ptr %x, null
565  %r = select i1 %cmpeq, i1 true, i1 %cmp
566  ret i1 %r
567}
568
569define i1 @sgt_and_min(ptr %x, ptr %y)  {
570; CHECK-LABEL: @sgt_and_min(
571; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
572; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null
573; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
574; CHECK-NEXT:    ret i1 [[R]]
575;
576  %cmp = icmp sgt ptr %x, %y
577  %cmpeq = icmp eq ptr %x, null
578  %r = and i1 %cmp, %cmpeq
579  ret i1 %r
580}
581
582define i1 @sgt_and_min_logical(ptr %x, ptr %y)  {
583; CHECK-LABEL: @sgt_and_min_logical(
584; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
585; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null
586; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
587; CHECK-NEXT:    ret i1 [[R]]
588;
589  %cmp = icmp sgt ptr %x, %y
590  %cmpeq = icmp eq ptr %x, null
591  %r = select i1 %cmp, i1 %cmpeq, i1 false
592  ret i1 %r
593}
594
595define i1 @sgt_and_min_logical_samesign(ptr %x, ptr %y)  {
596; CHECK-LABEL: @sgt_and_min_logical_samesign(
597; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
598; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null
599; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
600; CHECK-NEXT:    ret i1 [[R]]
601;
602  %cmp = icmp sgt ptr %x, %y
603  %cmpeq = icmp samesign eq ptr %x, null
604  %r = select i1 %cmp, i1 %cmpeq, i1 false
605  ret i1 %r
606}
607
608define i1 @sle_or_not_min(ptr %x, ptr %y)  {
609; CHECK-LABEL: @sle_or_not_min(
610; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
611; CHECK-NEXT:    [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null
612; CHECK-NEXT:    [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]
613; CHECK-NEXT:    ret i1 [[R]]
614;
615  %cmp = icmp sle ptr %x, %y
616  %cmpeq = icmp ne ptr %x, null
617  %r = or i1 %cmp, %cmpeq
618  ret i1 %r
619}
620
621define i1 @sle_or_not_min_logical(ptr %x, ptr %y)  {
622; CHECK-LABEL: @sle_or_not_min_logical(
623; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
624; CHECK-NEXT:    [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null
625; CHECK-NEXT:    [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]
626; CHECK-NEXT:    ret i1 [[R]]
627;
628  %cmp = icmp sle ptr %x, %y
629  %cmpeq = icmp ne ptr %x, null
630  %r = select i1 %cmp, i1 true, i1 %cmpeq
631  ret i1 %r
632}
633
634define i1 @sle_and_min(ptr %x, ptr %y)  {
635; CHECK-LABEL: @sle_and_min(
636; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
637; CHECK-NEXT:    [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null
638; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
639; CHECK-NEXT:    ret i1 [[R]]
640;
641  %cmp = icmp sle ptr %x, %y
642  %cmpeq = icmp eq ptr %x, null
643  %r = and i1 %cmp, %cmpeq
644  ret i1 %r
645}
646
647define i1 @sle_and_min_logical(ptr %x, ptr %y)  {
648; CHECK-LABEL: @sle_and_min_logical(
649; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[X:%.*]], null
650; CHECK-NEXT:    [[TMP1:%.*]] = icmp sge ptr [[Y:%.*]], null
651; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
652; CHECK-NEXT:    ret i1 [[R]]
653;
654  %cmp = icmp sle ptr %x, %y
655  %cmpeq = icmp eq ptr %x, null
656  %r = select i1 %cmp, i1 %cmpeq, i1 false
657  ret i1 %r
658}
659
660define i1 @sgt_and_not_min(ptr %x, ptr %y)  {
661; CHECK-LABEL: @sgt_and_not_min(
662; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt ptr [[X:%.*]], [[Y:%.*]]
663; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X]], null
664; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]
665; CHECK-NEXT:    ret i1 [[R]]
666;
667  %cmp = icmp sgt ptr %x, %y
668  %cmpeq = icmp ne ptr %x, null
669  %r = and i1 %cmp, %cmpeq
670  ret i1 %r
671}
672
673define i1 @sgt_and_not_min_logical(ptr %x, ptr %y)  {
674; CHECK-LABEL: @sgt_and_not_min_logical(
675; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt ptr [[X:%.*]], [[Y:%.*]]
676; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X]], null
677; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]
678; CHECK-NEXT:    ret i1 [[R]]
679;
680  %cmp = icmp sgt ptr %x, %y
681  %cmpeq = icmp ne ptr %x, null
682  %r = select i1 %cmp, i1 %cmpeq, i1 false
683  ret i1 %r
684}
685
686define i1 @sgt_or_not_min(ptr %x, ptr %y)  {
687; CHECK-LABEL: @sgt_or_not_min(
688; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
689; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null
690; CHECK-NEXT:    [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]
691; CHECK-NEXT:    ret i1 [[R]]
692;
693  %cmp = icmp sgt ptr %x, %y
694  %cmpeq = icmp ne ptr %x, null
695  %r = or i1 %cmp, %cmpeq
696  ret i1 %r
697}
698
699define i1 @sgt_or_not_min_logical(ptr %x, ptr %y)  {
700; CHECK-LABEL: @sgt_or_not_min_logical(
701; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp ne ptr [[X:%.*]], null
702; CHECK-NEXT:    [[TMP1:%.*]] = icmp slt ptr [[Y:%.*]], null
703; CHECK-NEXT:    [[R:%.*]] = or i1 [[CMPEQ]], [[TMP1]]
704; CHECK-NEXT:    ret i1 [[R]]
705;
706  %cmp = icmp sgt ptr %x, %y
707  %cmpeq = icmp ne ptr %x, null
708  %r = select i1 %cmp, i1 true, i1 %cmpeq
709  ret i1 %r
710}
711
712define i1 @slt_and_min(ptr %a, ptr %b) {
713; CHECK-LABEL: @slt_and_min(
714; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[A:%.*]], null
715; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt ptr [[B:%.*]], null
716; CHECK-NEXT:    [[R:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
717; CHECK-NEXT:    ret i1 [[R]]
718;
719  %cmpeq = icmp eq ptr %a, null
720  %cmp = icmp slt ptr %a, %b
721  %r = and i1 %cmpeq, %cmp
722  ret i1 %r
723}
724
725define i1 @slt_and_min_logical(ptr %a, ptr %b) {
726; CHECK-LABEL: @slt_and_min_logical(
727; CHECK-NEXT:    [[CMPEQ:%.*]] = icmp eq ptr [[A:%.*]], null
728; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt ptr [[B:%.*]], null
729; CHECK-NEXT:    [[R:%.*]] = select i1 [[CMPEQ]], i1 [[TMP1]], i1 false
730; CHECK-NEXT:    ret i1 [[R]]
731;
732  %cmpeq = icmp eq ptr %a, null
733  %cmp = icmp slt ptr %a, %b
734  %r = select i1 %cmpeq, i1 %cmp, i1 false
735  ret i1 %r
736}
737