1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
4 ; There are 12 basic patterns (or 6 with DeMorganized equivalent) with
5 ; 2 (commute logic op) *
6 ; 2 (swap compare operands) *
7 ; 2 (signed/unsigned) *
8 ; 2 (not of input operand)
9 ; variations for a total of 192 tests.
11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13 ; (X == MAX) && (X < Y) --> false
15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17 define i1 @slt_and_max(i8 %x, i8 %y) {
18 ; CHECK-LABEL: @slt_and_max(
19 ; CHECK-NEXT: ret i1 false
21 %cmp = icmp slt i8 %x, %y
22 %cmpeq = icmp eq i8 %x, 127
23 %r = and i1 %cmp, %cmpeq
27 define <2 x i1> @slt_and_max_commute(<2 x i8> %x, <2 x i8> %y) {
28 ; CHECK-LABEL: @slt_and_max_commute(
29 ; CHECK-NEXT: ret <2 x i1> zeroinitializer
31 %cmp = icmp slt <2 x i8> %x, %y
32 %cmpeq = icmp eq <2 x i8> %x, <i8 127, i8 127>
33 %r = and <2 x i1> %cmpeq, %cmp
37 define i1 @slt_swap_and_max(i8 %x, i8 %y) {
38 ; CHECK-LABEL: @slt_swap_and_max(
39 ; CHECK-NEXT: ret i1 false
41 %cmp = icmp sgt i8 %y, %x
42 %cmpeq = icmp eq i8 %x, 127
43 %r = and i1 %cmp, %cmpeq
47 define i1 @slt_swap_and_max_commute(i8 %x, i8 %y) {
48 ; CHECK-LABEL: @slt_swap_and_max_commute(
49 ; CHECK-NEXT: ret i1 false
51 %cmp = icmp sgt i8 %y, %x
52 %cmpeq = icmp eq i8 %x, 127
53 %r = and i1 %cmpeq, %cmp
57 define i1 @ult_and_max(i8 %x, i8 %y) {
58 ; CHECK-LABEL: @ult_and_max(
59 ; CHECK-NEXT: ret i1 false
61 %cmp = icmp ult i8 %x, %y
62 %cmpeq = icmp eq i8 %x, 255
63 %r = and i1 %cmp, %cmpeq
67 define i1 @ult_and_max_commute(i8 %x, i8 %y) {
68 ; CHECK-LABEL: @ult_and_max_commute(
69 ; CHECK-NEXT: ret i1 false
71 %cmp = icmp ult i8 %x, %y
72 %cmpeq = icmp eq i8 %x, 255
73 %r = and i1 %cmpeq, %cmp
77 define i1 @ult_swap_and_max(i8 %x, i8 %y) {
78 ; CHECK-LABEL: @ult_swap_and_max(
79 ; CHECK-NEXT: ret i1 false
81 %cmp = icmp ugt i8 %y, %x
82 %cmpeq = icmp eq i8 %x, 255
83 %r = and i1 %cmp, %cmpeq
87 define i1 @ult_swap_and_max_commute(i8 %x, i8 %y) {
88 ; CHECK-LABEL: @ult_swap_and_max_commute(
89 ; CHECK-NEXT: ret i1 false
91 %cmp = icmp ugt i8 %y, %x
92 %cmpeq = icmp eq i8 %x, 255
93 %r = and i1 %cmpeq, %cmp
97 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99 ; (X == MIN) && (X > Y) --> false
101 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103 define i1 @sgt_and_min(i9 %x, i9 %y) {
104 ; CHECK-LABEL: @sgt_and_min(
105 ; CHECK-NEXT: ret i1 false
107 %cmp = icmp sgt i9 %x, %y
108 %cmpeq = icmp eq i9 %x, 256
109 %r = and i1 %cmp, %cmpeq
113 define i1 @sgt_and_min_commute(i8 %x, i8 %y) {
114 ; CHECK-LABEL: @sgt_and_min_commute(
115 ; CHECK-NEXT: ret i1 false
117 %cmp = icmp sgt i8 %x, %y
118 %cmpeq = icmp eq i8 %x, 128
119 %r = and i1 %cmpeq, %cmp
123 define i1 @sgt_swap_and_min(i8 %x, i8 %y) {
124 ; CHECK-LABEL: @sgt_swap_and_min(
125 ; CHECK-NEXT: ret i1 false
127 %cmp = icmp slt i8 %y, %x
128 %cmpeq = icmp eq i8 %x, 128
129 %r = and i1 %cmp, %cmpeq
133 define i1 @sgt_swap_and_min_commute(i8 %x, i8 %y) {
134 ; CHECK-LABEL: @sgt_swap_and_min_commute(
135 ; CHECK-NEXT: ret i1 false
137 %cmp = icmp slt i8 %y, %x
138 %cmpeq = icmp eq i8 %x, 128
139 %r = and i1 %cmpeq, %cmp
143 define i1 @ugt_and_min(i8 %x, i8 %y) {
144 ; CHECK-LABEL: @ugt_and_min(
145 ; CHECK-NEXT: ret i1 false
147 %cmp = icmp ugt i8 %x, %y
148 %cmpeq = icmp eq i8 %x, 0
149 %r = and i1 %cmp, %cmpeq
153 define i1 @ugt_and_min_commute(i8 %x, i8 %y) {
154 ; CHECK-LABEL: @ugt_and_min_commute(
155 ; CHECK-NEXT: ret i1 false
157 %cmp = icmp ugt i8 %x, %y
158 %cmpeq = icmp eq i8 %x, 0
159 %r = and i1 %cmpeq, %cmp
163 define i1 @ugt_swap_and_min(i8 %x, i8 %y) {
164 ; CHECK-LABEL: @ugt_swap_and_min(
165 ; CHECK-NEXT: ret i1 false
167 %cmp = icmp ult i8 %y, %x
168 %cmpeq = icmp eq i8 %x, 0
169 %r = and i1 %cmp, %cmpeq
173 define i1 @ugt_swap_and_min_commute(i8 %x, i8 %y) {
174 ; CHECK-LABEL: @ugt_swap_and_min_commute(
175 ; CHECK-NEXT: ret i1 false
177 %cmp = icmp ult i8 %y, %x
178 %cmpeq = icmp eq i8 %x, 0
179 %r = and i1 %cmpeq, %cmp
183 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
185 ; (X != MAX) || (X >= Y) --> true
187 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
189 define i1 @sge_or_not_max(i8 %x, i8 %y) {
190 ; CHECK-LABEL: @sge_or_not_max(
191 ; CHECK-NEXT: ret i1 true
193 %cmp = icmp sge i8 %x, %y
194 %cmpeq = icmp ne i8 %x, 127
195 %r = or i1 %cmp, %cmpeq
199 define i1 @sge_or_not_max_commute(i8 %x, i8 %y) {
200 ; CHECK-LABEL: @sge_or_not_max_commute(
201 ; CHECK-NEXT: ret i1 true
203 %cmp = icmp sge i8 %x, %y
204 %cmpeq = icmp ne i8 %x, 127
205 %r = or i1 %cmpeq, %cmp
209 define i1 @sge_swap_or_not_max(i8 %x, i8 %y) {
210 ; CHECK-LABEL: @sge_swap_or_not_max(
211 ; CHECK-NEXT: ret i1 true
213 %cmp = icmp sle i8 %y, %x
214 %cmpeq = icmp ne i8 %x, 127
215 %r = or i1 %cmp, %cmpeq
219 define i1 @sge_swap_or_not_max_commute(i8 %x, i8 %y) {
220 ; CHECK-LABEL: @sge_swap_or_not_max_commute(
221 ; CHECK-NEXT: ret i1 true
223 %cmp = icmp sle i8 %y, %x
224 %cmpeq = icmp ne i8 %x, 127
225 %r = or i1 %cmpeq, %cmp
229 define i1 @uge_or_not_max(i8 %x, i8 %y) {
230 ; CHECK-LABEL: @uge_or_not_max(
231 ; CHECK-NEXT: ret i1 true
233 %cmp = icmp uge i8 %x, %y
234 %cmpeq = icmp ne i8 %x, 255
235 %r = or i1 %cmp, %cmpeq
239 define i1 @uge_or_not_max_commute(i8 %x, i8 %y) {
240 ; CHECK-LABEL: @uge_or_not_max_commute(
241 ; CHECK-NEXT: ret i1 true
243 %cmp = icmp uge i8 %x, %y
244 %cmpeq = icmp ne i8 %x, 255
245 %r = or i1 %cmpeq, %cmp
249 define i1 @uge_swap_or_not_max(i8 %x, i8 %y) {
250 ; CHECK-LABEL: @uge_swap_or_not_max(
251 ; CHECK-NEXT: ret i1 true
253 %cmp = icmp ule i8 %y, %x
254 %cmpeq = icmp ne i8 %x, 255
255 %r = or i1 %cmp, %cmpeq
259 define i1 @uge_swap_or_not_max_commute(i8 %x, i8 %y) {
260 ; CHECK-LABEL: @uge_swap_or_not_max_commute(
261 ; CHECK-NEXT: ret i1 true
263 %cmp = icmp ule i8 %y, %x
264 %cmpeq = icmp ne i8 %x, 255
265 %r = or i1 %cmpeq, %cmp
269 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
271 ; (X != MIN) || (X <= Y) --> true
273 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
275 define i1 @sle_or_not_min(i8 %x, i8 %y) {
276 ; CHECK-LABEL: @sle_or_not_min(
277 ; CHECK-NEXT: ret i1 true
279 %cmp = icmp sle i8 %x, %y
280 %cmpeq = icmp ne i8 %x, 128
281 %r = or i1 %cmp, %cmpeq
285 define i1 @sle_or_not_min_commute(i8 %x, i8 %y) {
286 ; CHECK-LABEL: @sle_or_not_min_commute(
287 ; CHECK-NEXT: ret i1 true
289 %cmp = icmp sle i8 %x, %y
290 %cmpeq = icmp ne i8 %x, 128
291 %r = or i1 %cmpeq, %cmp
295 define i1 @sle_swap_or_not_min(i8 %x, i8 %y) {
296 ; CHECK-LABEL: @sle_swap_or_not_min(
297 ; CHECK-NEXT: ret i1 true
299 %cmp = icmp sge i8 %y, %x
300 %cmpeq = icmp ne i8 %x, 128
301 %r = or i1 %cmp, %cmpeq
305 define i1 @sle_swap_or_not_min_commute(i8 %x, i8 %y) {
306 ; CHECK-LABEL: @sle_swap_or_not_min_commute(
307 ; CHECK-NEXT: ret i1 true
309 %cmp = icmp sge i8 %y, %x
310 %cmpeq = icmp ne i8 %x, 128
311 %r = or i1 %cmpeq, %cmp
315 define i1 @ule_or_not_min(i427 %x, i427 %y) {
316 ; CHECK-LABEL: @ule_or_not_min(
317 ; CHECK-NEXT: ret i1 true
319 %cmp = icmp ule i427 %x, %y
320 %cmpeq = icmp ne i427 %x, 0
321 %r = or i1 %cmp, %cmpeq
325 define i1 @ule_or_not_min_commute(i8 %x, i8 %y) {
326 ; CHECK-LABEL: @ule_or_not_min_commute(
327 ; CHECK-NEXT: ret i1 true
329 %cmp = icmp ule i8 %x, %y
330 %cmpeq = icmp ne i8 %x, 0
331 %r = or i1 %cmpeq, %cmp
335 define i1 @ule_swap_or_not_min(i8 %x, i8 %y) {
336 ; CHECK-LABEL: @ule_swap_or_not_min(
337 ; CHECK-NEXT: ret i1 true
339 %cmp = icmp uge i8 %y, %x
340 %cmpeq = icmp ne i8 %x, 0
341 %r = or i1 %cmp, %cmpeq
345 define i1 @ule_swap_or_not_min_commute(i8 %x, i8 %y) {
346 ; CHECK-LABEL: @ule_swap_or_not_min_commute(
347 ; CHECK-NEXT: ret i1 true
349 %cmp = icmp uge i8 %y, %x
350 %cmpeq = icmp ne i8 %x, 0
351 %r = or i1 %cmpeq, %cmp
355 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
357 ; (X == MAX) && (X >= Y) --> X == MAX
359 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
361 define i1 @sge_and_max(i8 %x, i8 %y) {
362 ; CHECK-LABEL: @sge_and_max(
363 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127
364 ; CHECK-NEXT: ret i1 [[CMPEQ]]
366 %cmp = icmp sge i8 %x, %y
367 %cmpeq = icmp eq i8 %x, 127
368 %r = and i1 %cmp, %cmpeq
372 define i1 @sge_and_max_commute(i8 %x, i8 %y) {
373 ; CHECK-LABEL: @sge_and_max_commute(
374 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127
375 ; CHECK-NEXT: ret i1 [[CMPEQ]]
377 %cmp = icmp sge i8 %x, %y
378 %cmpeq = icmp eq i8 %x, 127
379 %r = and i1 %cmpeq, %cmp
383 define i1 @sge_swap_and_max(i8 %x, i8 %y) {
384 ; CHECK-LABEL: @sge_swap_and_max(
385 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127
386 ; CHECK-NEXT: ret i1 [[CMPEQ]]
388 %cmp = icmp sle i8 %y, %x
389 %cmpeq = icmp eq i8 %x, 127
390 %r = and i1 %cmp, %cmpeq
394 define i1 @sge_swap_and_max_commute(i8 %x, i8 %y) {
395 ; CHECK-LABEL: @sge_swap_and_max_commute(
396 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 127
397 ; CHECK-NEXT: ret i1 [[CMPEQ]]
399 %cmp = icmp sle i8 %y, %x
400 %cmpeq = icmp eq i8 %x, 127
401 %r = and i1 %cmpeq, %cmp
405 define i1 @uge_and_max(i8 %x, i8 %y) {
406 ; CHECK-LABEL: @uge_and_max(
407 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1
408 ; CHECK-NEXT: ret i1 [[CMPEQ]]
410 %cmp = icmp uge i8 %x, %y
411 %cmpeq = icmp eq i8 %x, 255
412 %r = and i1 %cmp, %cmpeq
416 define i1 @uge_and_max_commute(i8 %x, i8 %y) {
417 ; CHECK-LABEL: @uge_and_max_commute(
418 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1
419 ; CHECK-NEXT: ret i1 [[CMPEQ]]
421 %cmp = icmp uge i8 %x, %y
422 %cmpeq = icmp eq i8 %x, 255
423 %r = and i1 %cmpeq, %cmp
427 define i1 @uge_swap_and_max(i8 %x, i8 %y) {
428 ; CHECK-LABEL: @uge_swap_and_max(
429 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1
430 ; CHECK-NEXT: ret i1 [[CMPEQ]]
432 %cmp = icmp ule i8 %y, %x
433 %cmpeq = icmp eq i8 %x, 255
434 %r = and i1 %cmp, %cmpeq
438 define i1 @uge_swap_and_max_commute(i8 %x, i8 %y) {
439 ; CHECK-LABEL: @uge_swap_and_max_commute(
440 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -1
441 ; CHECK-NEXT: ret i1 [[CMPEQ]]
443 %cmp = icmp ule i8 %y, %x
444 %cmpeq = icmp eq i8 %x, 255
445 %r = and i1 %cmpeq, %cmp
449 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
451 ; (X == MIN) && (X <= Y) --> X == MIN
453 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
455 define i1 @sle_and_min(i8 %x, i8 %y) {
456 ; CHECK-LABEL: @sle_and_min(
457 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
458 ; CHECK-NEXT: ret i1 [[CMPEQ]]
460 %cmp = icmp sle i8 %x, %y
461 %cmpeq = icmp eq i8 %x, 128
462 %r = and i1 %cmp, %cmpeq
466 define i1 @sle_and_min_commute(i8 %x, i8 %y) {
467 ; CHECK-LABEL: @sle_and_min_commute(
468 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
469 ; CHECK-NEXT: ret i1 [[CMPEQ]]
471 %cmp = icmp sle i8 %x, %y
472 %cmpeq = icmp eq i8 %x, 128
473 %r = and i1 %cmpeq, %cmp
477 define i1 @sle_swap_and_min(i8 %x, i8 %y) {
478 ; CHECK-LABEL: @sle_swap_and_min(
479 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
480 ; CHECK-NEXT: ret i1 [[CMPEQ]]
482 %cmp = icmp sge i8 %y, %x
483 %cmpeq = icmp eq i8 %x, 128
484 %r = and i1 %cmp, %cmpeq
488 define i1 @sle_swap_and_min_commute(i8 %x, i8 %y) {
489 ; CHECK-LABEL: @sle_swap_and_min_commute(
490 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
491 ; CHECK-NEXT: ret i1 [[CMPEQ]]
493 %cmp = icmp sge i8 %y, %x
494 %cmpeq = icmp eq i8 %x, 128
495 %r = and i1 %cmpeq, %cmp
499 define i1 @ule_and_min(i8 %x, i8 %y) {
500 ; CHECK-LABEL: @ule_and_min(
501 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
502 ; CHECK-NEXT: ret i1 [[CMPEQ]]
504 %cmp = icmp ule i8 %x, %y
505 %cmpeq = icmp eq i8 %x, 0
506 %r = and i1 %cmp, %cmpeq
510 define i1 @ule_and_min_commute(i8 %x, i8 %y) {
511 ; CHECK-LABEL: @ule_and_min_commute(
512 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
513 ; CHECK-NEXT: ret i1 [[CMPEQ]]
515 %cmp = icmp ule i8 %x, %y
516 %cmpeq = icmp eq i8 %x, 0
517 %r = and i1 %cmpeq, %cmp
521 define i1 @ule_swap_and_min(i8 %x, i8 %y) {
522 ; CHECK-LABEL: @ule_swap_and_min(
523 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
524 ; CHECK-NEXT: ret i1 [[CMPEQ]]
526 %cmp = icmp uge i8 %y, %x
527 %cmpeq = icmp eq i8 %x, 0
528 %r = and i1 %cmp, %cmpeq
532 define i1 @ule_swap_and_min_commute(i8 %x, i8 %y) {
533 ; CHECK-LABEL: @ule_swap_and_min_commute(
534 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
535 ; CHECK-NEXT: ret i1 [[CMPEQ]]
537 %cmp = icmp uge i8 %y, %x
538 %cmpeq = icmp eq i8 %x, 0
539 %r = and i1 %cmpeq, %cmp
543 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
545 ; (X == MAX) || (X >= Y) --> X >= Y
547 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
549 define i1 @sge_or_max(i8 %x, i8 %y) {
550 ; CHECK-LABEL: @sge_or_max(
551 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
552 ; CHECK-NEXT: ret i1 [[CMP]]
554 %cmp = icmp sge i8 %x, %y
555 %cmpeq = icmp eq i8 %x, 127
556 %r = or i1 %cmp, %cmpeq
560 define i1 @sge_or_max_commute(i8 %x, i8 %y) {
561 ; CHECK-LABEL: @sge_or_max_commute(
562 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
563 ; CHECK-NEXT: ret i1 [[CMP]]
565 %cmp = icmp sge i8 %x, %y
566 %cmpeq = icmp eq i8 %x, 127
567 %r = or i1 %cmpeq, %cmp
571 define i1 @sge_swap_or_max(i8 %x, i8 %y) {
572 ; CHECK-LABEL: @sge_swap_or_max(
573 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
574 ; CHECK-NEXT: ret i1 [[CMP]]
576 %cmp = icmp sle i8 %y, %x
577 %cmpeq = icmp eq i8 %x, 127
578 %r = or i1 %cmp, %cmpeq
582 define i1 @sge_swap_or_max_commute(i8 %x, i8 %y) {
583 ; CHECK-LABEL: @sge_swap_or_max_commute(
584 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
585 ; CHECK-NEXT: ret i1 [[CMP]]
587 %cmp = icmp sle i8 %y, %x
588 %cmpeq = icmp eq i8 %x, 127
589 %r = or i1 %cmpeq, %cmp
593 define i1 @uge_or_max(i8 %x, i8 %y) {
594 ; CHECK-LABEL: @uge_or_max(
595 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
596 ; CHECK-NEXT: ret i1 [[CMP]]
598 %cmp = icmp uge i8 %x, %y
599 %cmpeq = icmp eq i8 %x, 255
600 %r = or i1 %cmp, %cmpeq
604 define i1 @uge_or_max_commute(i8 %x, i8 %y) {
605 ; CHECK-LABEL: @uge_or_max_commute(
606 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
607 ; CHECK-NEXT: ret i1 [[CMP]]
609 %cmp = icmp uge i8 %x, %y
610 %cmpeq = icmp eq i8 %x, 255
611 %r = or i1 %cmpeq, %cmp
615 define i1 @uge_swap_or_max(i8 %x, i8 %y) {
616 ; CHECK-LABEL: @uge_swap_or_max(
617 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
618 ; CHECK-NEXT: ret i1 [[CMP]]
620 %cmp = icmp ule i8 %y, %x
621 %cmpeq = icmp eq i8 %x, 255
622 %r = or i1 %cmp, %cmpeq
626 define i1 @uge_swap_or_max_commute(i8 %x, i8 %y) {
627 ; CHECK-LABEL: @uge_swap_or_max_commute(
628 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
629 ; CHECK-NEXT: ret i1 [[CMP]]
631 %cmp = icmp ule i8 %y, %x
632 %cmpeq = icmp eq i8 %x, 255
633 %r = or i1 %cmpeq, %cmp
637 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
639 ; (X == MIN) || (X <= Y) --> X <= Y
641 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
643 define i1 @sle_or_min(i8 %x, i8 %y) {
644 ; CHECK-LABEL: @sle_or_min(
645 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
646 ; CHECK-NEXT: ret i1 [[CMP]]
648 %cmp = icmp sle i8 %x, %y
649 %cmpeq = icmp eq i8 %x, 128
650 %r = or i1 %cmp, %cmpeq
654 define i1 @sle_or_min_commute(i8 %x, i8 %y) {
655 ; CHECK-LABEL: @sle_or_min_commute(
656 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
657 ; CHECK-NEXT: ret i1 [[CMP]]
659 %cmp = icmp sle i8 %x, %y
660 %cmpeq = icmp eq i8 %x, 128
661 %r = or i1 %cmpeq, %cmp
665 define i1 @sle_swap_or_min(i8 %x, i8 %y) {
666 ; CHECK-LABEL: @sle_swap_or_min(
667 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
668 ; CHECK-NEXT: ret i1 [[CMP]]
670 %cmp = icmp sge i8 %y, %x
671 %cmpeq = icmp eq i8 %x, 128
672 %r = or i1 %cmp, %cmpeq
676 define i1 @sle_swap_or_min_commute(i8 %x, i8 %y) {
677 ; CHECK-LABEL: @sle_swap_or_min_commute(
678 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
679 ; CHECK-NEXT: ret i1 [[CMP]]
681 %cmp = icmp sge i8 %y, %x
682 %cmpeq = icmp eq i8 %x, 128
683 %r = or i1 %cmpeq, %cmp
687 define i1 @ule_or_min(i8 %x, i8 %y) {
688 ; CHECK-LABEL: @ule_or_min(
689 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
690 ; CHECK-NEXT: ret i1 [[CMP]]
692 %cmp = icmp ule i8 %x, %y
693 %cmpeq = icmp eq i8 %x, 0
694 %r = or i1 %cmp, %cmpeq
698 define i1 @ule_or_min_commute(i8 %x, i8 %y) {
699 ; CHECK-LABEL: @ule_or_min_commute(
700 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
701 ; CHECK-NEXT: ret i1 [[CMP]]
703 %cmp = icmp ule i8 %x, %y
704 %cmpeq = icmp eq i8 %x, 0
705 %r = or i1 %cmpeq, %cmp
709 define i1 @ule_swap_or_min(i8 %x, i8 %y) {
710 ; CHECK-LABEL: @ule_swap_or_min(
711 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
712 ; CHECK-NEXT: ret i1 [[CMP]]
714 %cmp = icmp uge i8 %y, %x
715 %cmpeq = icmp eq i8 %x, 0
716 %r = or i1 %cmp, %cmpeq
720 define i1 @ule_swap_or_min_commute(i8 %x, i8 %y) {
721 ; CHECK-LABEL: @ule_swap_or_min_commute(
722 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
723 ; CHECK-NEXT: ret i1 [[CMP]]
725 %cmp = icmp uge i8 %y, %x
726 %cmpeq = icmp eq i8 %x, 0
727 %r = or i1 %cmpeq, %cmp
731 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
733 ; (X != MAX) && (X < Y) --> X < Y
735 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
737 define i1 @slt_and_not_max(i8 %x, i8 %y) {
738 ; CHECK-LABEL: @slt_and_not_max(
739 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
740 ; CHECK-NEXT: ret i1 [[CMP]]
742 %cmp = icmp slt i8 %x, %y
743 %cmpeq = icmp ne i8 %x, 127
744 %r = and i1 %cmp, %cmpeq
748 define i1 @slt_and_not_max_commute(i8 %x, i8 %y) {
749 ; CHECK-LABEL: @slt_and_not_max_commute(
750 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
751 ; CHECK-NEXT: ret i1 [[CMP]]
753 %cmp = icmp slt i8 %x, %y
754 %cmpeq = icmp ne i8 %x, 127
755 %r = and i1 %cmpeq, %cmp
759 define i1 @slt_swap_and_not_max(i8 %x, i8 %y) {
760 ; CHECK-LABEL: @slt_swap_and_not_max(
761 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
762 ; CHECK-NEXT: ret i1 [[CMP]]
764 %cmp = icmp sgt i8 %y, %x
765 %cmpeq = icmp ne i8 %x, 127
766 %r = and i1 %cmp, %cmpeq
770 define i1 @slt_swap_and_not_max_commute(i8 %x, i8 %y) {
771 ; CHECK-LABEL: @slt_swap_and_not_max_commute(
772 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
773 ; CHECK-NEXT: ret i1 [[CMP]]
775 %cmp = icmp sgt i8 %y, %x
776 %cmpeq = icmp ne i8 %x, 127
777 %r = and i1 %cmpeq, %cmp
781 define i1 @ult_and_not_max(i8 %x, i8 %y) {
782 ; CHECK-LABEL: @ult_and_not_max(
783 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
784 ; CHECK-NEXT: ret i1 [[CMP]]
786 %cmp = icmp ult i8 %x, %y
787 %cmpeq = icmp ne i8 %x, 255
788 %r = and i1 %cmp, %cmpeq
792 define i1 @ult_and_not_max_commute(i8 %x, i8 %y) {
793 ; CHECK-LABEL: @ult_and_not_max_commute(
794 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
795 ; CHECK-NEXT: ret i1 [[CMP]]
797 %cmp = icmp ult i8 %x, %y
798 %cmpeq = icmp ne i8 %x, 255
799 %r = and i1 %cmpeq, %cmp
803 define i1 @ult_swap_and_not_max(i8 %x, i8 %y) {
804 ; CHECK-LABEL: @ult_swap_and_not_max(
805 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
806 ; CHECK-NEXT: ret i1 [[CMP]]
808 %cmp = icmp ugt i8 %y, %x
809 %cmpeq = icmp ne i8 %x, 255
810 %r = and i1 %cmp, %cmpeq
814 define i1 @ult_swap_and_not_max_commute(i8 %x, i8 %y) {
815 ; CHECK-LABEL: @ult_swap_and_not_max_commute(
816 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
817 ; CHECK-NEXT: ret i1 [[CMP]]
819 %cmp = icmp ugt i8 %y, %x
820 %cmpeq = icmp ne i8 %x, 255
821 %r = and i1 %cmpeq, %cmp
825 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
827 ; (X != MIN) && (X > Y) --> X > Y
829 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
831 define i1 @sgt_and_not_min(i8 %x, i8 %y) {
832 ; CHECK-LABEL: @sgt_and_not_min(
833 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
834 ; CHECK-NEXT: ret i1 [[CMP]]
836 %cmp = icmp sgt i8 %x, %y
837 %cmpeq = icmp ne i8 %x, 128
838 %r = and i1 %cmp, %cmpeq
842 define i1 @sgt_and_not_min_commute(i8 %x, i8 %y) {
843 ; CHECK-LABEL: @sgt_and_not_min_commute(
844 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
845 ; CHECK-NEXT: ret i1 [[CMP]]
847 %cmp = icmp sgt i8 %x, %y
848 %cmpeq = icmp ne i8 %x, 128
849 %r = and i1 %cmpeq, %cmp
853 define i1 @sgt_swap_and_not_min(i8 %x, i8 %y) {
854 ; CHECK-LABEL: @sgt_swap_and_not_min(
855 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
856 ; CHECK-NEXT: ret i1 [[CMP]]
858 %cmp = icmp slt i8 %y, %x
859 %cmpeq = icmp ne i8 %x, 128
860 %r = and i1 %cmp, %cmpeq
864 define i1 @sgt_swap_and_not_min_commute(i8 %x, i8 %y) {
865 ; CHECK-LABEL: @sgt_swap_and_not_min_commute(
866 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
867 ; CHECK-NEXT: ret i1 [[CMP]]
869 %cmp = icmp slt i8 %y, %x
870 %cmpeq = icmp ne i8 %x, 128
871 %r = and i1 %cmpeq, %cmp
875 define i1 @ugt_and_not_min(i8 %x, i8 %y) {
876 ; CHECK-LABEL: @ugt_and_not_min(
877 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
878 ; CHECK-NEXT: ret i1 [[CMP]]
880 %cmp = icmp ugt i8 %x, %y
881 %cmpeq = icmp ne i8 %x, 0
882 %r = and i1 %cmp, %cmpeq
886 define i1 @ugt_and_not_min_commute(i8 %x, i8 %y) {
887 ; CHECK-LABEL: @ugt_and_not_min_commute(
888 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
889 ; CHECK-NEXT: ret i1 [[CMP]]
891 %cmp = icmp ugt i8 %x, %y
892 %cmpeq = icmp ne i8 %x, 0
893 %r = and i1 %cmpeq, %cmp
897 define i1 @ugt_swap_and_not_min(i8 %x, i8 %y) {
898 ; CHECK-LABEL: @ugt_swap_and_not_min(
899 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
900 ; CHECK-NEXT: ret i1 [[CMP]]
902 %cmp = icmp ult i8 %y, %x
903 %cmpeq = icmp ne i8 %x, 0
904 %r = and i1 %cmp, %cmpeq
908 define i1 @ugt_swap_and_not_min_commute(i8 %x, i8 %y) {
909 ; CHECK-LABEL: @ugt_swap_and_not_min_commute(
910 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
911 ; CHECK-NEXT: ret i1 [[CMP]]
913 %cmp = icmp ult i8 %y, %x
914 %cmpeq = icmp ne i8 %x, 0
915 %r = and i1 %cmpeq, %cmp
919 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
921 ; (X != MAX) || (X < Y) --> X != MAX
923 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
925 define i1 @slt_or_not_max(i8 %x, i8 %y) {
926 ; CHECK-LABEL: @slt_or_not_max(
927 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
928 ; CHECK-NEXT: ret i1 [[CMPEQ]]
930 %cmp = icmp slt i8 %x, %y
931 %cmpeq = icmp ne i8 %x, 127
932 %r = or i1 %cmp, %cmpeq
936 define i1 @slt_or_not_max_commute(i8 %x, i8 %y) {
937 ; CHECK-LABEL: @slt_or_not_max_commute(
938 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
939 ; CHECK-NEXT: ret i1 [[CMPEQ]]
941 %cmp = icmp slt i8 %x, %y
942 %cmpeq = icmp ne i8 %x, 127
943 %r = or i1 %cmpeq, %cmp
947 define i1 @slt_swap_or_not_max(i8 %x, i8 %y) {
948 ; CHECK-LABEL: @slt_swap_or_not_max(
949 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
950 ; CHECK-NEXT: ret i1 [[CMPEQ]]
952 %cmp = icmp sgt i8 %y, %x
953 %cmpeq = icmp ne i8 %x, 127
954 %r = or i1 %cmp, %cmpeq
958 define i1 @slt_swap_or_not_max_commute(i8 %x, i8 %y) {
959 ; CHECK-LABEL: @slt_swap_or_not_max_commute(
960 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
961 ; CHECK-NEXT: ret i1 [[CMPEQ]]
963 %cmp = icmp sgt i8 %y, %x
964 %cmpeq = icmp ne i8 %x, 127
965 %r = or i1 %cmpeq, %cmp
969 define i1 @ult_or_not_max(i8 %x, i8 %y) {
970 ; CHECK-LABEL: @ult_or_not_max(
971 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1
972 ; CHECK-NEXT: ret i1 [[CMPEQ]]
974 %cmp = icmp ult i8 %x, %y
975 %cmpeq = icmp ne i8 %x, 255
976 %r = or i1 %cmp, %cmpeq
980 define i1 @ult_or_not_max_commute(i8 %x, i8 %y) {
981 ; CHECK-LABEL: @ult_or_not_max_commute(
982 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1
983 ; CHECK-NEXT: ret i1 [[CMPEQ]]
985 %cmp = icmp ult i8 %x, %y
986 %cmpeq = icmp ne i8 %x, 255
987 %r = or i1 %cmpeq, %cmp
991 define i1 @ult_swap_or_not_max(i8 %x, i8 %y) {
992 ; CHECK-LABEL: @ult_swap_or_not_max(
993 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1
994 ; CHECK-NEXT: ret i1 [[CMPEQ]]
996 %cmp = icmp ugt i8 %y, %x
997 %cmpeq = icmp ne i8 %x, 255
998 %r = or i1 %cmp, %cmpeq
1002 define i1 @ult_swap_or_not_max_commute(i8 %x, i8 %y) {
1003 ; CHECK-LABEL: @ult_swap_or_not_max_commute(
1004 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1
1005 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1007 %cmp = icmp ugt i8 %y, %x
1008 %cmpeq = icmp ne i8 %x, 255
1009 %r = or i1 %cmpeq, %cmp
1013 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1015 ; (X != MIN) || (X > Y) --> X != MIN
1017 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1019 define i1 @sgt_or_not_min(i8 %x, i8 %y) {
1020 ; CHECK-LABEL: @sgt_or_not_min(
1021 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
1022 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1024 %cmp = icmp sgt i8 %x, %y
1025 %cmpeq = icmp ne i8 %x, 128
1026 %r = or i1 %cmp, %cmpeq
1030 define i1 @sgt_or_not_min_commute(i8 %x, i8 %y) {
1031 ; CHECK-LABEL: @sgt_or_not_min_commute(
1032 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
1033 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1035 %cmp = icmp sgt i8 %x, %y
1036 %cmpeq = icmp ne i8 %x, 128
1037 %r = or i1 %cmpeq, %cmp
1041 define i1 @sgt_swap_or_not_min(i8 %x, i8 %y) {
1042 ; CHECK-LABEL: @sgt_swap_or_not_min(
1043 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
1044 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1046 %cmp = icmp slt i8 %y, %x
1047 %cmpeq = icmp ne i8 %x, 128
1048 %r = or i1 %cmp, %cmpeq
1052 define i1 @sgt_swap_or_not_min_commute(i8 %x, i8 %y) {
1053 ; CHECK-LABEL: @sgt_swap_or_not_min_commute(
1054 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
1055 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1057 %cmp = icmp slt i8 %y, %x
1058 %cmpeq = icmp ne i8 %x, 128
1059 %r = or i1 %cmpeq, %cmp
1063 define i1 @ugt_or_not_min(i8 %x, i8 %y) {
1064 ; CHECK-LABEL: @ugt_or_not_min(
1065 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0
1066 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1068 %cmp = icmp ugt i8 %x, %y
1069 %cmpeq = icmp ne i8 %x, 0
1070 %r = or i1 %cmp, %cmpeq
1074 define i1 @ugt_or_not_min_commute(i8 %x, i8 %y) {
1075 ; CHECK-LABEL: @ugt_or_not_min_commute(
1076 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0
1077 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1079 %cmp = icmp ugt i8 %x, %y
1080 %cmpeq = icmp ne i8 %x, 0
1081 %r = or i1 %cmpeq, %cmp
1085 define i1 @ugt_swap_or_not_min(i8 %x, i8 %y) {
1086 ; CHECK-LABEL: @ugt_swap_or_not_min(
1087 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0
1088 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1090 %cmp = icmp ult i8 %y, %x
1091 %cmpeq = icmp ne i8 %x, 0
1092 %r = or i1 %cmp, %cmpeq
1096 define i1 @ugt_swap_or_not_min_commute(i823 %x, i823 %y) {
1097 ; CHECK-LABEL: @ugt_swap_or_not_min_commute(
1098 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i823 [[X:%.*]], 0
1099 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1101 %cmp = icmp ult i823 %y, %x
1102 %cmpeq = icmp ne i823 %x, 0
1103 %r = or i1 %cmpeq, %cmp
1107 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1109 ; (X == MIN) && (!X < Y) --> false
1111 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1113 define i1 @slt_and_max_not_op(i8 %x, i8 %y) {
1114 ; CHECK-LABEL: @slt_and_max_not_op(
1115 ; CHECK-NEXT: ret i1 false
1117 %notx = xor i8 %x, -1
1118 %cmp = icmp slt i8 %notx, %y
1119 %cmpeq = icmp eq i8 %x, 128
1120 %r = and i1 %cmp, %cmpeq
1124 define <2 x i1> @slt_and_max_commute_not_op(<2 x i8> %x, <2 x i8> %y) {
1125 ; CHECK-LABEL: @slt_and_max_commute_not_op(
1126 ; CHECK-NEXT: ret <2 x i1> zeroinitializer
1128 %notx = xor <2 x i8> %x, <i8 -1, i8 -1>
1129 %cmp = icmp slt <2 x i8> %notx, %y
1130 %cmpeq = icmp eq <2 x i8> %x, <i8 128, i8 128>
1131 %r = and <2 x i1> %cmpeq, %cmp
1135 define i1 @slt_swap_and_max_not_op(i8 %x, i8 %y) {
1136 ; CHECK-LABEL: @slt_swap_and_max_not_op(
1137 ; CHECK-NEXT: ret i1 false
1139 %notx = xor i8 %x, -1
1140 %cmp = icmp sgt i8 %y, %notx
1141 %cmpeq = icmp eq i8 %x, 128
1142 %r = and i1 %cmp, %cmpeq
1146 define i1 @slt_swap_and_max_commute_not_op(i8 %x, i8 %y) {
1147 ; CHECK-LABEL: @slt_swap_and_max_commute_not_op(
1148 ; CHECK-NEXT: ret i1 false
1150 %notx = xor i8 %x, -1
1151 %cmp = icmp sgt i8 %y, %notx
1152 %cmpeq = icmp eq i8 %x, 128
1153 %r = and i1 %cmpeq, %cmp
1157 define i1 @ult_and_max_not_op(i8 %x, i8 %y) {
1158 ; CHECK-LABEL: @ult_and_max_not_op(
1159 ; CHECK-NEXT: ret i1 false
1161 %notx = xor i8 %x, -1
1162 %cmp = icmp ult i8 %notx, %y
1163 %cmpeq = icmp eq i8 %x, 0
1164 %r = and i1 %cmp, %cmpeq
1168 define i1 @ult_and_max_commute_not_op(i8 %x, i8 %y) {
1169 ; CHECK-LABEL: @ult_and_max_commute_not_op(
1170 ; CHECK-NEXT: ret i1 false
1172 %notx = xor i8 %x, -1
1173 %cmp = icmp ult i8 %notx, %y
1174 %cmpeq = icmp eq i8 %x, 0
1175 %r = and i1 %cmpeq, %cmp
1179 define i1 @ult_swap_and_max_not_op(i8 %x, i8 %y) {
1180 ; CHECK-LABEL: @ult_swap_and_max_not_op(
1181 ; CHECK-NEXT: ret i1 false
1183 %notx = xor i8 %x, -1
1184 %cmp = icmp ugt i8 %y, %notx
1185 %cmpeq = icmp eq i8 %x, 0
1186 %r = and i1 %cmp, %cmpeq
1190 define i1 @ult_swap_and_max_commute_not_op(i8 %x, i8 %y) {
1191 ; CHECK-LABEL: @ult_swap_and_max_commute_not_op(
1192 ; CHECK-NEXT: ret i1 false
1194 %notx = xor i8 %x, -1
1195 %cmp = icmp ugt i8 %y, %notx
1196 %cmpeq = icmp eq i8 %x, 0
1197 %r = and i1 %cmpeq, %cmp
1201 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1203 ; (X == MAX) && (!X > Y) --> false
1205 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1207 define i1 @sgt_and_min_not_op(i9 %x, i9 %y) {
1208 ; CHECK-LABEL: @sgt_and_min_not_op(
1209 ; CHECK-NEXT: ret i1 false
1211 %notx = xor i9 %x, -1
1212 %cmp = icmp sgt i9 %notx, %y
1213 %cmpeq = icmp eq i9 %x, 255
1214 %r = and i1 %cmp, %cmpeq
1218 define i1 @sgt_and_min_commute_not_op(i8 %x, i8 %y) {
1219 ; CHECK-LABEL: @sgt_and_min_commute_not_op(
1220 ; CHECK-NEXT: ret i1 false
1222 %notx = xor i8 %x, -1
1223 %cmp = icmp sgt i8 %notx, %y
1224 %cmpeq = icmp eq i8 %x, 127
1225 %r = and i1 %cmpeq, %cmp
1229 define i1 @sgt_swap_and_min_not_op(i8 %x, i8 %y) {
1230 ; CHECK-LABEL: @sgt_swap_and_min_not_op(
1231 ; CHECK-NEXT: ret i1 false
1233 %notx = xor i8 %x, -1
1234 %cmp = icmp slt i8 %y, %notx
1235 %cmpeq = icmp eq i8 %x, 127
1236 %r = and i1 %cmp, %cmpeq
1240 define i1 @sgt_swap_and_min_commute_not_op(i8 %x, i8 %y) {
1241 ; CHECK-LABEL: @sgt_swap_and_min_commute_not_op(
1242 ; CHECK-NEXT: ret i1 false
1244 %notx = xor i8 %x, -1
1245 %cmp = icmp slt i8 %y, %notx
1246 %cmpeq = icmp eq i8 %x, 127
1247 %r = and i1 %cmpeq, %cmp
1251 define i1 @ugt_and_min_not_op(i8 %x, i8 %y) {
1252 ; CHECK-LABEL: @ugt_and_min_not_op(
1253 ; CHECK-NEXT: ret i1 false
1255 %notx = xor i8 %x, -1
1256 %cmp = icmp ugt i8 %notx, %y
1257 %cmpeq = icmp eq i8 %x, 255
1258 %r = and i1 %cmp, %cmpeq
1262 define i1 @ugt_and_min_commute_not_op(i8 %x, i8 %y) {
1263 ; CHECK-LABEL: @ugt_and_min_commute_not_op(
1264 ; CHECK-NEXT: ret i1 false
1266 %notx = xor i8 %x, -1
1267 %cmp = icmp ugt i8 %notx, %y
1268 %cmpeq = icmp eq i8 %x, 255
1269 %r = and i1 %cmpeq, %cmp
1273 define i1 @ugt_swap_and_min_not_op(i8 %x, i8 %y) {
1274 ; CHECK-LABEL: @ugt_swap_and_min_not_op(
1275 ; CHECK-NEXT: ret i1 false
1277 %notx = xor i8 %x, -1
1278 %cmp = icmp ult i8 %y, %notx
1279 %cmpeq = icmp eq i8 %x, 255
1280 %r = and i1 %cmp, %cmpeq
1284 define i1 @ugt_swap_and_min_commute_not_op(i8 %x, i8 %y) {
1285 ; CHECK-LABEL: @ugt_swap_and_min_commute_not_op(
1286 ; CHECK-NEXT: ret i1 false
1288 %notx = xor i8 %x, -1
1289 %cmp = icmp ult i8 %y, %notx
1290 %cmpeq = icmp eq i8 %x, 255
1291 %r = and i1 %cmpeq, %cmp
1295 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1297 ; (X != MIN) || (!X >= Y) --> true
1299 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1301 define i1 @sge_or_not_max_not_op(i8 %x, i8 %y) {
1302 ; CHECK-LABEL: @sge_or_not_max_not_op(
1303 ; CHECK-NEXT: ret i1 true
1305 %notx = xor i8 %x, -1
1306 %cmp = icmp sge i8 %notx, %y
1307 %cmpeq = icmp ne i8 %x, 128
1308 %r = or i1 %cmp, %cmpeq
1312 define i1 @sge_or_not_max_commute_not_op(i8 %x, i8 %y) {
1313 ; CHECK-LABEL: @sge_or_not_max_commute_not_op(
1314 ; CHECK-NEXT: ret i1 true
1316 %notx = xor i8 %x, -1
1317 %cmp = icmp sge i8 %notx, %y
1318 %cmpeq = icmp ne i8 %x, 128
1319 %r = or i1 %cmpeq, %cmp
1323 define i1 @sge_swap_or_not_max_not_op(i8 %x, i8 %y) {
1324 ; CHECK-LABEL: @sge_swap_or_not_max_not_op(
1325 ; CHECK-NEXT: ret i1 true
1327 %notx = xor i8 %x, -1
1328 %cmp = icmp sle i8 %y, %notx
1329 %cmpeq = icmp ne i8 %x, 128
1330 %r = or i1 %cmp, %cmpeq
1334 define i1 @sge_swap_or_not_max_commute_not_op(i8 %x, i8 %y) {
1335 ; CHECK-LABEL: @sge_swap_or_not_max_commute_not_op(
1336 ; CHECK-NEXT: ret i1 true
1338 %notx = xor i8 %x, -1
1339 %cmp = icmp sle i8 %y, %notx
1340 %cmpeq = icmp ne i8 %x, 128
1341 %r = or i1 %cmpeq, %cmp
1345 define i1 @uge_or_not_max_not_op(i8 %x, i8 %y) {
1346 ; CHECK-LABEL: @uge_or_not_max_not_op(
1347 ; CHECK-NEXT: ret i1 true
1349 %notx = xor i8 %x, -1
1350 %cmp = icmp uge i8 %notx, %y
1351 %cmpeq = icmp ne i8 %x, 0
1352 %r = or i1 %cmp, %cmpeq
1356 define i1 @uge_or_not_max_commute_not_op(i8 %x, i8 %y) {
1357 ; CHECK-LABEL: @uge_or_not_max_commute_not_op(
1358 ; CHECK-NEXT: ret i1 true
1360 %notx = xor i8 %x, -1
1361 %cmp = icmp uge i8 %notx, %y
1362 %cmpeq = icmp ne i8 %x, 0
1363 %r = or i1 %cmpeq, %cmp
1367 define i1 @uge_swap_or_not_max_not_op(i8 %x, i8 %y) {
1368 ; CHECK-LABEL: @uge_swap_or_not_max_not_op(
1369 ; CHECK-NEXT: ret i1 true
1371 %notx = xor i8 %x, -1
1372 %cmp = icmp ule i8 %y, %notx
1373 %cmpeq = icmp ne i8 %x, 0
1374 %r = or i1 %cmp, %cmpeq
1378 define i1 @uge_swap_or_not_max_commute_not_op(i8 %x, i8 %y) {
1379 ; CHECK-LABEL: @uge_swap_or_not_max_commute_not_op(
1380 ; CHECK-NEXT: ret i1 true
1382 %notx = xor i8 %x, -1
1383 %cmp = icmp ule i8 %y, %notx
1384 %cmpeq = icmp ne i8 %x, 0
1385 %r = or i1 %cmpeq, %cmp
1389 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1391 ; (X != MAX) || (!X <= Y) --> true
1393 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1395 define i1 @sle_or_not_min_not_op(i8 %x, i8 %y) {
1396 ; CHECK-LABEL: @sle_or_not_min_not_op(
1397 ; CHECK-NEXT: ret i1 true
1399 %notx = xor i8 %x, -1
1400 %cmp = icmp sle i8 %notx, %y
1401 %cmpeq = icmp ne i8 %x, 127
1402 %r = or i1 %cmp, %cmpeq
1406 define i1 @sle_or_not_min_commute_not_op(i8 %x, i8 %y) {
1407 ; CHECK-LABEL: @sle_or_not_min_commute_not_op(
1408 ; CHECK-NEXT: ret i1 true
1410 %notx = xor i8 %x, -1
1411 %cmp = icmp sle i8 %notx, %y
1412 %cmpeq = icmp ne i8 %x, 127
1413 %r = or i1 %cmpeq, %cmp
1417 define i1 @sle_swap_or_not_min_not_op(i8 %x, i8 %y) {
1418 ; CHECK-LABEL: @sle_swap_or_not_min_not_op(
1419 ; CHECK-NEXT: ret i1 true
1421 %notx = xor i8 %x, -1
1422 %cmp = icmp sge i8 %y, %notx
1423 %cmpeq = icmp ne i8 %x, 127
1424 %r = or i1 %cmp, %cmpeq
1428 define i1 @sle_swap_or_not_min_commute_not_op(i8 %x, i8 %y) {
1429 ; CHECK-LABEL: @sle_swap_or_not_min_commute_not_op(
1430 ; CHECK-NEXT: ret i1 true
1432 %notx = xor i8 %x, -1
1433 %cmp = icmp sge i8 %y, %notx
1434 %cmpeq = icmp ne i8 %x, 127
1435 %r = or i1 %cmpeq, %cmp
1439 define i1 @ule_or_not_min_not_op(i427 %x, i427 %y) {
1440 ; CHECK-LABEL: @ule_or_not_min_not_op(
1441 ; CHECK-NEXT: ret i1 true
1443 %notx = xor i427 %x, -1
1444 %cmp = icmp ule i427 %notx, %y
1445 %cmpeq = icmp ne i427 %x, -1
1446 %r = or i1 %cmp, %cmpeq
1450 define i1 @ule_or_not_min_commute_not_op(i8 %x, i8 %y) {
1451 ; CHECK-LABEL: @ule_or_not_min_commute_not_op(
1452 ; CHECK-NEXT: ret i1 true
1454 %notx = xor i8 %x, -1
1455 %cmp = icmp ule i8 %notx, %y
1456 %cmpeq = icmp ne i8 %x, 255
1457 %r = or i1 %cmpeq, %cmp
1461 define i1 @ule_swap_or_not_min_not_op(i8 %x, i8 %y) {
1462 ; CHECK-LABEL: @ule_swap_or_not_min_not_op(
1463 ; CHECK-NEXT: ret i1 true
1465 %notx = xor i8 %x, -1
1466 %cmp = icmp uge i8 %y, %notx
1467 %cmpeq = icmp ne i8 %x, 255
1468 %r = or i1 %cmp, %cmpeq
1472 define i1 @ule_swap_or_not_min_commute_not_op(i8 %x, i8 %y) {
1473 ; CHECK-LABEL: @ule_swap_or_not_min_commute_not_op(
1474 ; CHECK-NEXT: ret i1 true
1476 %notx = xor i8 %x, -1
1477 %cmp = icmp uge i8 %y, %notx
1478 %cmpeq = icmp ne i8 %x, 255
1479 %r = or i1 %cmpeq, %cmp
1483 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1485 ; (X == MIN) && (!X >= Y) --> X == MIN
1487 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1489 define i1 @sge_and_max_not_op(i8 %x, i8 %y) {
1490 ; CHECK-LABEL: @sge_and_max_not_op(
1491 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
1492 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1494 %notx = xor i8 %x, -1
1495 %cmp = icmp sge i8 %notx, %y
1496 %cmpeq = icmp eq i8 %x, 128
1497 %r = and i1 %cmp, %cmpeq
1501 define i1 @sge_and_max_commute_not_op(i8 %x, i8 %y) {
1502 ; CHECK-LABEL: @sge_and_max_commute_not_op(
1503 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
1504 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1506 %notx = xor i8 %x, -1
1507 %cmp = icmp sge i8 %notx, %y
1508 %cmpeq = icmp eq i8 %x, 128
1509 %r = and i1 %cmpeq, %cmp
1513 define i1 @sge_swap_and_max_not_op(i8 %x, i8 %y) {
1514 ; CHECK-LABEL: @sge_swap_and_max_not_op(
1515 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
1516 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1518 %notx = xor i8 %x, -1
1519 %cmp = icmp sle i8 %y, %notx
1520 %cmpeq = icmp eq i8 %x, 128
1521 %r = and i1 %cmp, %cmpeq
1525 define i1 @sge_swap_and_max_commute_not_op(i8 %x, i8 %y) {
1526 ; CHECK-LABEL: @sge_swap_and_max_commute_not_op(
1527 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], -128
1528 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1530 %notx = xor i8 %x, -1
1531 %cmp = icmp sle i8 %y, %notx
1532 %cmpeq = icmp eq i8 %x, 128
1533 %r = and i1 %cmpeq, %cmp
1537 define i1 @uge_and_max_not_op(i8 %x, i8 %y) {
1538 ; CHECK-LABEL: @uge_and_max_not_op(
1539 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
1540 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1542 %notx = xor i8 %x, -1
1543 %cmp = icmp uge i8 %notx, %y
1544 %cmpeq = icmp eq i8 %x, 0
1545 %r = and i1 %cmp, %cmpeq
1549 define i1 @uge_and_max_commute_not_op(i8 %x, i8 %y) {
1550 ; CHECK-LABEL: @uge_and_max_commute_not_op(
1551 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
1552 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1554 %notx = xor i8 %x, -1
1555 %cmp = icmp uge i8 %notx, %y
1556 %cmpeq = icmp eq i8 %x, 0
1557 %r = and i1 %cmpeq, %cmp
1561 define i1 @uge_swap_and_max_not_op(i8 %x, i8 %y) {
1562 ; CHECK-LABEL: @uge_swap_and_max_not_op(
1563 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
1564 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1566 %notx = xor i8 %x, -1
1567 %cmp = icmp ule i8 %y, %notx
1568 %cmpeq = icmp eq i8 %x, 0
1569 %r = and i1 %cmp, %cmpeq
1573 define i1 @uge_swap_and_max_commute_not_op(i8 %x, i8 %y) {
1574 ; CHECK-LABEL: @uge_swap_and_max_commute_not_op(
1575 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X:%.*]], 0
1576 ; CHECK-NEXT: ret i1 [[CMPEQ]]
1578 %notx = xor i8 %x, -1
1579 %cmp = icmp ule i8 %y, %notx
1580 %cmpeq = icmp eq i8 %x, 0
1581 %r = and i1 %cmpeq, %cmp
1585 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1587 ; (X == MIN) && (!X <= Y) --> X == MIN
1589 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1591 define i1 @sle_and_min_not_op(i8 %x, i8 %y) {
1592 ; CHECK-LABEL: @sle_and_min_not_op(
1593 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1594 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[NOTX]], [[Y:%.*]]
1595 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128
1596 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]
1597 ; CHECK-NEXT: ret i1 [[R]]
1599 %notx = xor i8 %x, -1
1600 %cmp = icmp sle i8 %notx, %y
1601 %cmpeq = icmp eq i8 %x, 128
1602 %r = and i1 %cmp, %cmpeq
1606 define i1 @sle_and_min_commute_not_op(i8 %x, i8 %y) {
1607 ; CHECK-LABEL: @sle_and_min_commute_not_op(
1608 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1609 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[NOTX]], [[Y:%.*]]
1610 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128
1611 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]]
1612 ; CHECK-NEXT: ret i1 [[R]]
1614 %notx = xor i8 %x, -1
1615 %cmp = icmp sle i8 %notx, %y
1616 %cmpeq = icmp eq i8 %x, 128
1617 %r = and i1 %cmpeq, %cmp
1621 define i1 @sle_swap_and_min_not_op(i8 %x, i8 %y) {
1622 ; CHECK-LABEL: @sle_swap_and_min_not_op(
1623 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1624 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[NOTX]]
1625 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128
1626 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]
1627 ; CHECK-NEXT: ret i1 [[R]]
1629 %notx = xor i8 %x, -1
1630 %cmp = icmp sge i8 %y, %notx
1631 %cmpeq = icmp eq i8 %x, 128
1632 %r = and i1 %cmp, %cmpeq
1636 define i1 @sle_swap_and_min_commute_not_op(i8 %x, i8 %y) {
1637 ; CHECK-LABEL: @sle_swap_and_min_commute_not_op(
1638 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1639 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[NOTX]]
1640 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128
1641 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]]
1642 ; CHECK-NEXT: ret i1 [[R]]
1644 %notx = xor i8 %x, -1
1645 %cmp = icmp sge i8 %y, %notx
1646 %cmpeq = icmp eq i8 %x, 128
1647 %r = and i1 %cmpeq, %cmp
1651 define i1 @ule_and_min_not_op(i8 %x, i8 %y) {
1652 ; CHECK-LABEL: @ule_and_min_not_op(
1653 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1654 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[NOTX]], [[Y:%.*]]
1655 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0
1656 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]
1657 ; CHECK-NEXT: ret i1 [[R]]
1659 %notx = xor i8 %x, -1
1660 %cmp = icmp ule i8 %notx, %y
1661 %cmpeq = icmp eq i8 %x, 0
1662 %r = and i1 %cmp, %cmpeq
1666 define i1 @ule_and_min_commute_not_op(i8 %x, i8 %y) {
1667 ; CHECK-LABEL: @ule_and_min_commute_not_op(
1668 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1669 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[NOTX]], [[Y:%.*]]
1670 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0
1671 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]]
1672 ; CHECK-NEXT: ret i1 [[R]]
1674 %notx = xor i8 %x, -1
1675 %cmp = icmp ule i8 %notx, %y
1676 %cmpeq = icmp eq i8 %x, 0
1677 %r = and i1 %cmpeq, %cmp
1681 define i1 @ule_swap_and_min_not_op(i8 %x, i8 %y) {
1682 ; CHECK-LABEL: @ule_swap_and_min_not_op(
1683 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1684 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[NOTX]]
1685 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0
1686 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP]], [[CMPEQ]]
1687 ; CHECK-NEXT: ret i1 [[R]]
1689 %notx = xor i8 %x, -1
1690 %cmp = icmp uge i8 %y, %notx
1691 %cmpeq = icmp eq i8 %x, 0
1692 %r = and i1 %cmp, %cmpeq
1696 define i1 @ule_swap_and_min_commute_not_op(i8 %x, i8 %y) {
1697 ; CHECK-LABEL: @ule_swap_and_min_commute_not_op(
1698 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1699 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[NOTX]]
1700 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0
1701 ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMPEQ]], [[CMP]]
1702 ; CHECK-NEXT: ret i1 [[R]]
1704 %notx = xor i8 %x, -1
1705 %cmp = icmp uge i8 %y, %notx
1706 %cmpeq = icmp eq i8 %x, 0
1707 %r = and i1 %cmpeq, %cmp
1711 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1713 ; (X == MIN) || (!X >= Y) --> !X >= Y
1715 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1717 define i1 @sge_or_max_not_op(i8 %x, i8 %y) {
1718 ; CHECK-LABEL: @sge_or_max_not_op(
1719 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1720 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[NOTX]], [[Y:%.*]]
1721 ; CHECK-NEXT: ret i1 [[CMP]]
1723 %notx = xor i8 %x, -1
1724 %cmp = icmp sge i8 %notx, %y
1725 %cmpeq = icmp eq i8 %x, 128
1726 %r = or i1 %cmp, %cmpeq
1730 define i1 @sge_or_max_commute_not_op(i8 %x, i8 %y) {
1731 ; CHECK-LABEL: @sge_or_max_commute_not_op(
1732 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1733 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[NOTX]], [[Y:%.*]]
1734 ; CHECK-NEXT: ret i1 [[CMP]]
1736 %notx = xor i8 %x, -1
1737 %cmp = icmp sge i8 %notx, %y
1738 %cmpeq = icmp eq i8 %x, 128
1739 %r = or i1 %cmpeq, %cmp
1743 define i1 @sge_swap_or_max_not_op(i8 %x, i8 %y) {
1744 ; CHECK-LABEL: @sge_swap_or_max_not_op(
1745 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1746 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[NOTX]]
1747 ; CHECK-NEXT: ret i1 [[CMP]]
1749 %notx = xor i8 %x, -1
1750 %cmp = icmp sle i8 %y, %notx
1751 %cmpeq = icmp eq i8 %x, 128
1752 %r = or i1 %cmp, %cmpeq
1756 define i1 @sge_swap_or_max_commute_not_op(i8 %x, i8 %y) {
1757 ; CHECK-LABEL: @sge_swap_or_max_commute_not_op(
1758 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1759 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[NOTX]]
1760 ; CHECK-NEXT: ret i1 [[CMP]]
1762 %notx = xor i8 %x, -1
1763 %cmp = icmp sle i8 %y, %notx
1764 %cmpeq = icmp eq i8 %x, 128
1765 %r = or i1 %cmpeq, %cmp
1769 define i1 @uge_or_max_not_op(i8 %x, i8 %y) {
1770 ; CHECK-LABEL: @uge_or_max_not_op(
1771 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1772 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[NOTX]], [[Y:%.*]]
1773 ; CHECK-NEXT: ret i1 [[CMP]]
1775 %notx = xor i8 %x, -1
1776 %cmp = icmp uge i8 %notx, %y
1777 %cmpeq = icmp eq i8 %x, 0
1778 %r = or i1 %cmp, %cmpeq
1782 define i1 @uge_or_max_commute_not_op(i8 %x, i8 %y) {
1783 ; CHECK-LABEL: @uge_or_max_commute_not_op(
1784 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1785 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[NOTX]], [[Y:%.*]]
1786 ; CHECK-NEXT: ret i1 [[CMP]]
1788 %notx = xor i8 %x, -1
1789 %cmp = icmp uge i8 %notx, %y
1790 %cmpeq = icmp eq i8 %x, 0
1791 %r = or i1 %cmpeq, %cmp
1795 define i1 @uge_swap_or_max_not_op(i8 %x, i8 %y) {
1796 ; CHECK-LABEL: @uge_swap_or_max_not_op(
1797 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1798 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[NOTX]]
1799 ; CHECK-NEXT: ret i1 [[CMP]]
1801 %notx = xor i8 %x, -1
1802 %cmp = icmp ule i8 %y, %notx
1803 %cmpeq = icmp eq i8 %x, 0
1804 %r = or i1 %cmp, %cmpeq
1808 define i1 @uge_swap_or_max_commute_not_op(i8 %x, i8 %y) {
1809 ; CHECK-LABEL: @uge_swap_or_max_commute_not_op(
1810 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1811 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[NOTX]]
1812 ; CHECK-NEXT: ret i1 [[CMP]]
1814 %notx = xor i8 %x, -1
1815 %cmp = icmp ule i8 %y, %notx
1816 %cmpeq = icmp eq i8 %x, 0
1817 %r = or i1 %cmpeq, %cmp
1821 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1823 ; (X == MAX) || (!X <= Y) --> !X <= Y
1825 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1827 define i1 @sle_or_min_not_op(i8 %x, i8 %y) {
1828 ; CHECK-LABEL: @sle_or_min_not_op(
1829 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1830 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[NOTX]], [[Y:%.*]]
1831 ; CHECK-NEXT: ret i1 [[CMP]]
1833 %notx = xor i8 %x, -1
1834 %cmp = icmp sle i8 %notx, %y
1835 %cmpeq = icmp eq i8 %x, 127
1836 %r = or i1 %cmp, %cmpeq
1840 define i1 @sle_or_min_commute_not_op(i8 %x, i8 %y) {
1841 ; CHECK-LABEL: @sle_or_min_commute_not_op(
1842 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1843 ; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[NOTX]], [[Y:%.*]]
1844 ; CHECK-NEXT: ret i1 [[CMP]]
1846 %notx = xor i8 %x, -1
1847 %cmp = icmp sle i8 %notx, %y
1848 %cmpeq = icmp eq i8 %x, 127
1849 %r = or i1 %cmpeq, %cmp
1853 define i1 @sle_swap_or_min_not_op(i8 %x, i8 %y) {
1854 ; CHECK-LABEL: @sle_swap_or_min_not_op(
1855 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1856 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[NOTX]]
1857 ; CHECK-NEXT: ret i1 [[CMP]]
1859 %notx = xor i8 %x, -1
1860 %cmp = icmp sge i8 %y, %notx
1861 %cmpeq = icmp eq i8 %x, 127
1862 %r = or i1 %cmp, %cmpeq
1866 define i1 @sle_swap_or_min_commute_not_op(i8 %x, i8 %y) {
1867 ; CHECK-LABEL: @sle_swap_or_min_commute_not_op(
1868 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1869 ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[NOTX]]
1870 ; CHECK-NEXT: ret i1 [[CMP]]
1872 %notx = xor i8 %x, -1
1873 %cmp = icmp sge i8 %y, %notx
1874 %cmpeq = icmp eq i8 %x, 127
1875 %r = or i1 %cmpeq, %cmp
1879 define i1 @ule_or_min_not_op(i8 %x, i8 %y) {
1880 ; CHECK-LABEL: @ule_or_min_not_op(
1881 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1882 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[NOTX]], [[Y:%.*]]
1883 ; CHECK-NEXT: ret i1 [[CMP]]
1885 %notx = xor i8 %x, -1
1886 %cmp = icmp ule i8 %notx, %y
1887 %cmpeq = icmp eq i8 %x, 255
1888 %r = or i1 %cmp, %cmpeq
1892 define i1 @ule_or_min_commute_not_op(i8 %x, i8 %y) {
1893 ; CHECK-LABEL: @ule_or_min_commute_not_op(
1894 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1895 ; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[NOTX]], [[Y:%.*]]
1896 ; CHECK-NEXT: ret i1 [[CMP]]
1898 %notx = xor i8 %x, -1
1899 %cmp = icmp ule i8 %notx, %y
1900 %cmpeq = icmp eq i8 %x, 255
1901 %r = or i1 %cmpeq, %cmp
1905 define i1 @ule_swap_or_min_not_op(i8 %x, i8 %y) {
1906 ; CHECK-LABEL: @ule_swap_or_min_not_op(
1907 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1908 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[NOTX]]
1909 ; CHECK-NEXT: ret i1 [[CMP]]
1911 %notx = xor i8 %x, -1
1912 %cmp = icmp uge i8 %y, %notx
1913 %cmpeq = icmp eq i8 %x, 255
1914 %r = or i1 %cmp, %cmpeq
1918 define i1 @ule_swap_or_min_commute_not_op(i8 %x, i8 %y) {
1919 ; CHECK-LABEL: @ule_swap_or_min_commute_not_op(
1920 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1921 ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[NOTX]]
1922 ; CHECK-NEXT: ret i1 [[CMP]]
1924 %notx = xor i8 %x, -1
1925 %cmp = icmp uge i8 %y, %notx
1926 %cmpeq = icmp eq i8 %x, 255
1927 %r = or i1 %cmpeq, %cmp
1931 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1933 ; (X != MIN) && (!X < Y) --> !X < Y
1935 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1937 define i1 @slt_and_not_max_not_op(i8 %x, i8 %y) {
1938 ; CHECK-LABEL: @slt_and_not_max_not_op(
1939 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1940 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[NOTX]], [[Y:%.*]]
1941 ; CHECK-NEXT: ret i1 [[CMP]]
1943 %notx = xor i8 %x, -1
1944 %cmp = icmp slt i8 %notx, %y
1945 %cmpeq = icmp ne i8 %x, 128
1946 %r = and i1 %cmp, %cmpeq
1950 define i1 @slt_and_not_max_commute_not_op(i8 %x, i8 %y) {
1951 ; CHECK-LABEL: @slt_and_not_max_commute_not_op(
1952 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1953 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[NOTX]], [[Y:%.*]]
1954 ; CHECK-NEXT: ret i1 [[CMP]]
1956 %notx = xor i8 %x, -1
1957 %cmp = icmp slt i8 %notx, %y
1958 %cmpeq = icmp ne i8 %x, 128
1959 %r = and i1 %cmpeq, %cmp
1963 define i1 @slt_swap_and_not_max_not_op(i8 %x, i8 %y) {
1964 ; CHECK-LABEL: @slt_swap_and_not_max_not_op(
1965 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1966 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[NOTX]]
1967 ; CHECK-NEXT: ret i1 [[CMP]]
1969 %notx = xor i8 %x, -1
1970 %cmp = icmp sgt i8 %y, %notx
1971 %cmpeq = icmp ne i8 %x, 128
1972 %r = and i1 %cmp, %cmpeq
1976 define i1 @slt_swap_and_not_max_commute_not_op(i8 %x, i8 %y) {
1977 ; CHECK-LABEL: @slt_swap_and_not_max_commute_not_op(
1978 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1979 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[NOTX]]
1980 ; CHECK-NEXT: ret i1 [[CMP]]
1982 %notx = xor i8 %x, -1
1983 %cmp = icmp sgt i8 %y, %notx
1984 %cmpeq = icmp ne i8 %x, 128
1985 %r = and i1 %cmpeq, %cmp
1989 define i1 @ult_and_not_max_not_op(i8 %x, i8 %y) {
1990 ; CHECK-LABEL: @ult_and_not_max_not_op(
1991 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
1992 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[NOTX]], [[Y:%.*]]
1993 ; CHECK-NEXT: ret i1 [[CMP]]
1995 %notx = xor i8 %x, -1
1996 %cmp = icmp ult i8 %notx, %y
1997 %cmpeq = icmp ne i8 %x, 0
1998 %r = and i1 %cmp, %cmpeq
2002 define i1 @ult_and_not_max_commute_not_op(i8 %x, i8 %y) {
2003 ; CHECK-LABEL: @ult_and_not_max_commute_not_op(
2004 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2005 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[NOTX]], [[Y:%.*]]
2006 ; CHECK-NEXT: ret i1 [[CMP]]
2008 %notx = xor i8 %x, -1
2009 %cmp = icmp ult i8 %notx, %y
2010 %cmpeq = icmp ne i8 %x, 0
2011 %r = and i1 %cmpeq, %cmp
2015 define i1 @ult_swap_and_not_max_not_op(i8 %x, i8 %y) {
2016 ; CHECK-LABEL: @ult_swap_and_not_max_not_op(
2017 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2018 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[NOTX]]
2019 ; CHECK-NEXT: ret i1 [[CMP]]
2021 %notx = xor i8 %x, -1
2022 %cmp = icmp ugt i8 %y, %notx
2023 %cmpeq = icmp ne i8 %x, 0
2024 %r = and i1 %cmp, %cmpeq
2028 define i1 @ult_swap_and_not_max_commute_not_op(i8 %x, i8 %y) {
2029 ; CHECK-LABEL: @ult_swap_and_not_max_commute_not_op(
2030 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2031 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[NOTX]]
2032 ; CHECK-NEXT: ret i1 [[CMP]]
2034 %notx = xor i8 %x, -1
2035 %cmp = icmp ugt i8 %y, %notx
2036 %cmpeq = icmp ne i8 %x, 0
2037 %r = and i1 %cmpeq, %cmp
2041 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2043 ; (X != MAX) && (!X > Y) --> !X > Y
2045 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2047 define i1 @sgt_and_not_min_not_op(i8 %x, i8 %y) {
2048 ; CHECK-LABEL: @sgt_and_not_min_not_op(
2049 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2050 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[NOTX]], [[Y:%.*]]
2051 ; CHECK-NEXT: ret i1 [[CMP]]
2053 %notx = xor i8 %x, -1
2054 %cmp = icmp sgt i8 %notx, %y
2055 %cmpeq = icmp ne i8 %x, 127
2056 %r = and i1 %cmp, %cmpeq
2060 define i1 @sgt_and_not_min_commute_not_op(i8 %x, i8 %y) {
2061 ; CHECK-LABEL: @sgt_and_not_min_commute_not_op(
2062 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2063 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[NOTX]], [[Y:%.*]]
2064 ; CHECK-NEXT: ret i1 [[CMP]]
2066 %notx = xor i8 %x, -1
2067 %cmp = icmp sgt i8 %notx, %y
2068 %cmpeq = icmp ne i8 %x, 127
2069 %r = and i1 %cmpeq, %cmp
2073 define i1 @sgt_swap_and_not_min_not_op(i8 %x, i8 %y) {
2074 ; CHECK-LABEL: @sgt_swap_and_not_min_not_op(
2075 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2076 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[NOTX]]
2077 ; CHECK-NEXT: ret i1 [[CMP]]
2079 %notx = xor i8 %x, -1
2080 %cmp = icmp slt i8 %y, %notx
2081 %cmpeq = icmp ne i8 %x, 127
2082 %r = and i1 %cmp, %cmpeq
2086 define i1 @sgt_swap_and_not_min_commute_not_op(i8 %x, i8 %y) {
2087 ; CHECK-LABEL: @sgt_swap_and_not_min_commute_not_op(
2088 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2089 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[NOTX]]
2090 ; CHECK-NEXT: ret i1 [[CMP]]
2092 %notx = xor i8 %x, -1
2093 %cmp = icmp slt i8 %y, %notx
2094 %cmpeq = icmp ne i8 %x, 127
2095 %r = and i1 %cmpeq, %cmp
2099 define i1 @ugt_and_not_min_not_op(i8 %x, i8 %y) {
2100 ; CHECK-LABEL: @ugt_and_not_min_not_op(
2101 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2102 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[NOTX]], [[Y:%.*]]
2103 ; CHECK-NEXT: ret i1 [[CMP]]
2105 %notx = xor i8 %x, -1
2106 %cmp = icmp ugt i8 %notx, %y
2107 %cmpeq = icmp ne i8 %x, 255
2108 %r = and i1 %cmp, %cmpeq
2112 define i1 @ugt_and_not_min_commute_not_op(i8 %x, i8 %y) {
2113 ; CHECK-LABEL: @ugt_and_not_min_commute_not_op(
2114 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2115 ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[NOTX]], [[Y:%.*]]
2116 ; CHECK-NEXT: ret i1 [[CMP]]
2118 %notx = xor i8 %x, -1
2119 %cmp = icmp ugt i8 %notx, %y
2120 %cmpeq = icmp ne i8 %x, 255
2121 %r = and i1 %cmpeq, %cmp
2125 define i1 @ugt_swap_and_not_min_not_op(i8 %x, i8 %y) {
2126 ; CHECK-LABEL: @ugt_swap_and_not_min_not_op(
2127 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2128 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[NOTX]]
2129 ; CHECK-NEXT: ret i1 [[CMP]]
2131 %notx = xor i8 %x, -1
2132 %cmp = icmp ult i8 %y, %notx
2133 %cmpeq = icmp ne i8 %x, 255
2134 %r = and i1 %cmp, %cmpeq
2138 define i1 @ugt_swap_and_not_min_commute_not_op(i8 %x, i8 %y) {
2139 ; CHECK-LABEL: @ugt_swap_and_not_min_commute_not_op(
2140 ; CHECK-NEXT: [[NOTX:%.*]] = xor i8 [[X:%.*]], -1
2141 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[NOTX]]
2142 ; CHECK-NEXT: ret i1 [[CMP]]
2144 %notx = xor i8 %x, -1
2145 %cmp = icmp ult i8 %y, %notx
2146 %cmpeq = icmp ne i8 %x, 255
2147 %r = and i1 %cmpeq, %cmp
2151 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2153 ; (X != MIN) || (!X < Y) --> X != MIN
2155 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2157 define i1 @slt_or_not_max_not_op(i8 %x, i8 %y) {
2158 ; CHECK-LABEL: @slt_or_not_max_not_op(
2159 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
2160 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2162 %notx = xor i8 %x, -1
2163 %cmp = icmp slt i8 %notx, %y
2164 %cmpeq = icmp ne i8 %x, 128
2165 %r = or i1 %cmp, %cmpeq
2169 define i1 @slt_or_not_max_commute_not_op(i8 %x, i8 %y) {
2170 ; CHECK-LABEL: @slt_or_not_max_commute_not_op(
2171 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
2172 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2174 %notx = xor i8 %x, -1
2175 %cmp = icmp slt i8 %notx, %y
2176 %cmpeq = icmp ne i8 %x, 128
2177 %r = or i1 %cmpeq, %cmp
2181 define i1 @slt_swap_or_not_max_not_op(i8 %x, i8 %y) {
2182 ; CHECK-LABEL: @slt_swap_or_not_max_not_op(
2183 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
2184 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2186 %notx = xor i8 %x, -1
2187 %cmp = icmp sgt i8 %y, %notx
2188 %cmpeq = icmp ne i8 %x, 128
2189 %r = or i1 %cmp, %cmpeq
2193 define i1 @slt_swap_or_not_max_commute_not_op(i8 %x, i8 %y) {
2194 ; CHECK-LABEL: @slt_swap_or_not_max_commute_not_op(
2195 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -128
2196 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2198 %notx = xor i8 %x, -1
2199 %cmp = icmp sgt i8 %y, %notx
2200 %cmpeq = icmp ne i8 %x, 128
2201 %r = or i1 %cmpeq, %cmp
2205 define i1 @ult_or_not_max_not_op(i8 %x, i8 %y) {
2206 ; CHECK-LABEL: @ult_or_not_max_not_op(
2207 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0
2208 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2210 %notx = xor i8 %x, -1
2211 %cmp = icmp ult i8 %notx, %y
2212 %cmpeq = icmp ne i8 %x, 0
2213 %r = or i1 %cmp, %cmpeq
2217 define i1 @ult_or_not_max_commute_not_op(i8 %x, i8 %y) {
2218 ; CHECK-LABEL: @ult_or_not_max_commute_not_op(
2219 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0
2220 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2222 %notx = xor i8 %x, -1
2223 %cmp = icmp ult i8 %notx, %y
2224 %cmpeq = icmp ne i8 %x, 0
2225 %r = or i1 %cmpeq, %cmp
2229 define i1 @ult_swap_or_not_max_not_op(i8 %x, i8 %y) {
2230 ; CHECK-LABEL: @ult_swap_or_not_max_not_op(
2231 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0
2232 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2234 %notx = xor i8 %x, -1
2235 %cmp = icmp ugt i8 %y, %notx
2236 %cmpeq = icmp ne i8 %x, 0
2237 %r = or i1 %cmp, %cmpeq
2241 define i1 @ult_swap_or_not_max_commute_not_op(i8 %x, i8 %y) {
2242 ; CHECK-LABEL: @ult_swap_or_not_max_commute_not_op(
2243 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 0
2244 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2246 %notx = xor i8 %x, -1
2247 %cmp = icmp ugt i8 %y, %notx
2248 %cmpeq = icmp ne i8 %x, 0
2249 %r = or i1 %cmpeq, %cmp
2253 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2255 ; (X != MAX) || (!X > Y) --> X != MAX
2257 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2259 define i1 @sgt_or_not_min_not_op(i8 %x, i8 %y) {
2260 ; CHECK-LABEL: @sgt_or_not_min_not_op(
2261 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
2262 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2264 %notx = xor i8 %x, -1
2265 %cmp = icmp sgt i8 %notx, %y
2266 %cmpeq = icmp ne i8 %x, 127
2267 %r = or i1 %cmp, %cmpeq
2271 define i1 @sgt_or_not_min_commute_not_op(i8 %x, i8 %y) {
2272 ; CHECK-LABEL: @sgt_or_not_min_commute_not_op(
2273 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
2274 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2276 %notx = xor i8 %x, -1
2277 %cmp = icmp sgt i8 %notx, %y
2278 %cmpeq = icmp ne i8 %x, 127
2279 %r = or i1 %cmpeq, %cmp
2283 define i1 @sgt_swap_or_not_min_not_op(i8 %x, i8 %y) {
2284 ; CHECK-LABEL: @sgt_swap_or_not_min_not_op(
2285 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
2286 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2288 %notx = xor i8 %x, -1
2289 %cmp = icmp slt i8 %y, %notx
2290 %cmpeq = icmp ne i8 %x, 127
2291 %r = or i1 %cmp, %cmpeq
2295 define i1 @sgt_swap_or_not_min_commute_not_op(i8 %x, i8 %y) {
2296 ; CHECK-LABEL: @sgt_swap_or_not_min_commute_not_op(
2297 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], 127
2298 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2300 %notx = xor i8 %x, -1
2301 %cmp = icmp slt i8 %y, %notx
2302 %cmpeq = icmp ne i8 %x, 127
2303 %r = or i1 %cmpeq, %cmp
2307 define i1 @ugt_or_not_min_not_op(i8 %x, i8 %y) {
2308 ; CHECK-LABEL: @ugt_or_not_min_not_op(
2309 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1
2310 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2312 %notx = xor i8 %x, -1
2313 %cmp = icmp ugt i8 %notx, %y
2314 %cmpeq = icmp ne i8 %x, 255
2315 %r = or i1 %cmp, %cmpeq
2319 define i1 @ugt_or_not_min_commute_not_op(i8 %x, i8 %y) {
2320 ; CHECK-LABEL: @ugt_or_not_min_commute_not_op(
2321 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1
2322 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2324 %notx = xor i8 %x, -1
2325 %cmp = icmp ugt i8 %notx, %y
2326 %cmpeq = icmp ne i8 %x, 255
2327 %r = or i1 %cmpeq, %cmp
2331 define i1 @ugt_swap_or_not_min_not_op(i8 %x, i8 %y) {
2332 ; CHECK-LABEL: @ugt_swap_or_not_min_not_op(
2333 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X:%.*]], -1
2334 ; CHECK-NEXT: ret i1 [[CMPEQ]]
2336 %notx = xor i8 %x, -1
2337 %cmp = icmp ult i8 %y, %notx
2338 %cmpeq = icmp ne i8 %x, 255
2339 %r = or i1 %cmp, %cmpeq
2343 define i1 @ugt_swap_or_not_min_commute_not_op(i823 %x, i823 %y) {
2344 ; CHECK-LABEL: @ugt_swap_or_not_min_commute_not_op(
2345 ; CHECK-NEXT: [[NOTX:%.*]] = xor i823 [[X:%.*]], -1
2346 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i823 [[Y:%.*]], [[NOTX]]
2347 ; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i823 [[X]], 255
2348 ; CHECK-NEXT: [[R:%.*]] = or i1 [[CMPEQ]], [[CMP]]
2349 ; CHECK-NEXT: ret i1 [[R]]
2351 %notx = xor i823 %x, -1
2352 %cmp = icmp ult i823 %y, %notx
2353 %cmpeq = icmp ne i823 %x, 255
2354 %r = or i1 %cmpeq, %cmp