1 ; RUN: opt < %s -instcombine -S | FileCheck %s
3 target datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
5 ; CHECK-LABEL: @exact_lshr_eq_both_zero
6 ; CHECK-NEXT: ret i1 true
7 define i1 @exact_lshr_eq_both_zero(i8 %a) {
8 %shr = lshr exact i8 0, %a
9 %cmp = icmp eq i8 %shr, 0
13 ; CHECK-LABEL: @exact_ashr_eq_both_zero
14 ; CHECK-NEXT: ret i1 true
15 define i1 @exact_ashr_eq_both_zero(i8 %a) {
16 %shr = ashr exact i8 0, %a
17 %cmp = icmp eq i8 %shr, 0
21 ; CHECK-LABEL: @nonexact_lshr_eq_both_zero
22 ; CHECK-NEXT: ret i1 true
23 define i1 @nonexact_lshr_eq_both_zero(i8 %a) {
25 %cmp = icmp eq i8 %shr, 0
29 ; CHECK-LABEL: @nonexact_ashr_eq_both_zero
30 ; CHECK-NEXT: ret i1 true
31 define i1 @nonexact_ashr_eq_both_zero(i8 %a) {
33 %cmp = icmp eq i8 %shr, 0
37 ; CHECK-LABEL: @exact_lshr_ne_both_zero
38 ; CHECK-NEXT: ret i1 false
39 define i1 @exact_lshr_ne_both_zero(i8 %a) {
40 %shr = lshr exact i8 0, %a
41 %cmp = icmp ne i8 %shr, 0
45 ; CHECK-LABEL: @exact_ashr_ne_both_zero
46 ; CHECK-NEXT: ret i1 false
47 define i1 @exact_ashr_ne_both_zero(i8 %a) {
48 %shr = ashr exact i8 0, %a
49 %cmp = icmp ne i8 %shr, 0
53 ; CHECK-LABEL: @nonexact_lshr_ne_both_zero
54 ; CHECK-NEXT: ret i1 false
55 define i1 @nonexact_lshr_ne_both_zero(i8 %a) {
57 %cmp = icmp ne i8 %shr, 0
61 ; CHECK-LABEL: @nonexact_ashr_ne_both_zero
62 ; CHECK-NEXT: ret i1 false
63 define i1 @nonexact_ashr_ne_both_zero(i8 %a) {
65 %cmp = icmp ne i8 %shr, 0
69 ; CHECK-LABEL: @exact_lshr_eq_last_zero
70 ; CHECK-NEXT: ret i1 false
71 define i1 @exact_lshr_eq_last_zero(i8 %a) {
72 %shr = lshr exact i8 128, %a
73 %cmp = icmp eq i8 %shr, 0
77 ; CHECK-LABEL: @exact_ashr_eq_last_zero
78 ; CHECK-NEXT: ret i1 false
79 define i1 @exact_ashr_eq_last_zero(i8 %a) {
80 %shr = ashr exact i8 -128, %a
81 %cmp = icmp eq i8 %shr, 0
85 ; CHECK-LABEL: @exact_lshr_ne_last_zero
86 ; CHECK-NEXT: ret i1 true
87 define i1 @exact_lshr_ne_last_zero(i8 %a) {
88 %shr = lshr exact i8 128, %a
89 %cmp = icmp ne i8 %shr, 0
93 ; CHECK-LABEL: @exact_ashr_ne_last_zero
94 ; CHECK-NEXT: ret i1 true
95 define i1 @exact_ashr_ne_last_zero(i8 %a) {
96 %shr = ashr exact i8 -128, %a
97 %cmp = icmp ne i8 %shr, 0
101 ; CHECK-LABEL: @nonexact_lshr_eq_last_zero
102 ; CHECK-NEXT: ret i1 false
103 define i1 @nonexact_lshr_eq_last_zero(i8 %a) {
104 %shr = lshr i8 128, %a
105 %cmp = icmp eq i8 %shr, 0
109 ; CHECK-LABEL: @nonexact_ashr_eq_last_zero
110 ; CHECK-NEXT: ret i1 false
111 define i1 @nonexact_ashr_eq_last_zero(i8 %a) {
112 %shr = ashr i8 -128, %a
113 %cmp = icmp eq i8 %shr, 0
117 ; CHECK-LABEL: @nonexact_lshr_ne_last_zero
118 ; CHECK-NEXT: ret i1 true
119 define i1 @nonexact_lshr_ne_last_zero(i8 %a) {
120 %shr = lshr i8 128, %a
121 %cmp = icmp ne i8 %shr, 0
125 ; CHECK-LABEL: @nonexact_ashr_ne_last_zero
126 ; CHECK-NEXT: ret i1 true
127 define i1 @nonexact_ashr_ne_last_zero(i8 %a) {
128 %shr = ashr i8 -128, %a
129 %cmp = icmp ne i8 %shr, 0
133 ; CHECK-LABEL: @lshr_eq_msb_low_last_zero
134 ; CHECK-NEXT: icmp ugt i8 %a, 6
135 define i1 @lshr_eq_msb_low_last_zero(i8 %a) {
136 %shr = lshr i8 127, %a
137 %cmp = icmp eq i8 %shr, 0
141 ; CHECK-LABEL: @ashr_eq_msb_low_second_zero
142 ; CHECK-NEXT: icmp ugt i8 %a, 6
143 define i1 @ashr_eq_msb_low_second_zero(i8 %a) {
144 %shr = ashr i8 127, %a
145 %cmp = icmp eq i8 %shr, 0
149 ; CHECK-LABEL: @lshr_ne_msb_low_last_zero
150 ; CHECK-NEXT: icmp ult i8 %a, 7
151 define i1 @lshr_ne_msb_low_last_zero(i8 %a) {
152 %shr = lshr i8 127, %a
153 %cmp = icmp ne i8 %shr, 0
157 ; CHECK-LABEL: @ashr_ne_msb_low_second_zero
158 ; CHECK-NEXT: icmp ult i8 %a, 7
159 define i1 @ashr_ne_msb_low_second_zero(i8 %a) {
160 %shr = ashr i8 127, %a
161 %cmp = icmp ne i8 %shr, 0
165 ; CHECK-LABEL: @lshr_eq_first_zero
166 ; CHECK-NEXT: ret i1 false
167 define i1 @lshr_eq_first_zero(i8 %a) {
169 %cmp = icmp eq i8 %shr, 2
173 ; CHECK-LABEL: @ashr_eq_first_zero
174 ; CHECK-NEXT: ret i1 false
175 define i1 @ashr_eq_first_zero(i8 %a) {
177 %cmp = icmp eq i8 %shr, 2
181 ; CHECK-LABEL: @lshr_ne_first_zero
182 ; CHECK-NEXT: ret i1 true
183 define i1 @lshr_ne_first_zero(i8 %a) {
185 %cmp = icmp ne i8 %shr, 2
189 ; CHECK-LABEL: @ashr_ne_first_zero
190 ; CHECK-NEXT: ret i1 true
191 define i1 @ashr_ne_first_zero(i8 %a) {
193 %cmp = icmp ne i8 %shr, 2
197 ; CHECK-LABEL: @ashr_eq_both_minus1
198 ; CHECK-NEXT: ret i1 true
199 define i1 @ashr_eq_both_minus1(i8 %a) {
200 %shr = ashr i8 -1, %a
201 %cmp = icmp eq i8 %shr, -1
205 ; CHECK-LABEL: @ashr_ne_both_minus1
206 ; CHECK-NEXT: ret i1 false
207 define i1 @ashr_ne_both_minus1(i8 %a) {
208 %shr = ashr i8 -1, %a
209 %cmp = icmp ne i8 %shr, -1
213 ; CHECK-LABEL: @exact_ashr_eq_both_minus1
214 ; CHECK-NEXT: ret i1 true
215 define i1 @exact_ashr_eq_both_minus1(i8 %a) {
216 %shr = ashr exact i8 -1, %a
217 %cmp = icmp eq i8 %shr, -1
221 ; CHECK-LABEL: @exact_ashr_ne_both_minus1
222 ; CHECK-NEXT: ret i1 false
223 define i1 @exact_ashr_ne_both_minus1(i8 %a) {
224 %shr = ashr exact i8 -1, %a
225 %cmp = icmp ne i8 %shr, -1
229 ; CHECK-LABEL: @ashr_eq_both_equal
230 ; CHECK-NEXT: icmp eq i8 %a, 0
231 define i1 @ashr_eq_both_equal(i8 %a) {
232 %shr = ashr i8 128, %a
233 %cmp = icmp eq i8 %shr, 128
237 ; CHECK-LABEL: @ashr_ne_both_equal
238 ; CHECK-NEXT: icmp ne i8 %a, 0
239 define i1 @ashr_ne_both_equal(i8 %a) {
240 %shr = ashr i8 128, %a
241 %cmp = icmp ne i8 %shr, 128
245 ; CHECK-LABEL: @lshr_eq_both_equal
246 ; CHECK-NEXT: icmp eq i8 %a, 0
247 define i1 @lshr_eq_both_equal(i8 %a) {
248 %shr = lshr i8 127, %a
249 %cmp = icmp eq i8 %shr, 127
253 ; CHECK-LABEL: @lshr_ne_both_equal
254 ; CHECK-NEXT: icmp ne i8 %a, 0
255 define i1 @lshr_ne_both_equal(i8 %a) {
256 %shr = lshr i8 127, %a
257 %cmp = icmp ne i8 %shr, 127
261 ; CHECK-LABEL: @exact_ashr_eq_both_equal
262 ; CHECK-NEXT: icmp eq i8 %a, 0
263 define i1 @exact_ashr_eq_both_equal(i8 %a) {
264 %shr = ashr exact i8 128, %a
265 %cmp = icmp eq i8 %shr, 128
269 ; CHECK-LABEL: @exact_ashr_ne_both_equal
270 ; CHECK-NEXT: icmp ne i8 %a, 0
271 define i1 @exact_ashr_ne_both_equal(i8 %a) {
272 %shr = ashr exact i8 128, %a
273 %cmp = icmp ne i8 %shr, 128
277 ; CHECK-LABEL: @exact_lshr_eq_both_equal
278 ; CHECK-NEXT: icmp eq i8 %a, 0
279 define i1 @exact_lshr_eq_both_equal(i8 %a) {
280 %shr = lshr exact i8 126, %a
281 %cmp = icmp eq i8 %shr, 126
285 ; CHECK-LABEL: @exact_lshr_ne_both_equal
286 ; CHECK-NEXT: icmp ne i8 %a, 0
287 define i1 @exact_lshr_ne_both_equal(i8 %a) {
288 %shr = lshr exact i8 126, %a
289 %cmp = icmp ne i8 %shr, 126
293 ; CHECK-LABEL: @exact_ashr_eq_opposite_msb
294 ; CHECK-NEXT: ret i1 false
295 define i1 @exact_ashr_eq_opposite_msb(i8 %a) {
296 %shr = ashr exact i8 -128, %a
297 %cmp = icmp eq i8 %shr, 1
301 ; CHECK-LABEL: @ashr_eq_opposite_msb
302 ; CHECK-NEXT: ret i1 false
303 define i1 @ashr_eq_opposite_msb(i8 %a) {
304 %shr = ashr i8 -128, %a
305 %cmp = icmp eq i8 %shr, 1
309 ; CHECK-LABEL: @exact_lshr_eq_opposite_msb
310 ; CHECK-NEXT: icmp eq i8 %a, 7
311 define i1 @exact_lshr_eq_opposite_msb(i8 %a) {
312 %shr = lshr exact i8 -128, %a
313 %cmp = icmp eq i8 %shr, 1
317 ; CHECK-LABEL: @lshr_eq_opposite_msb
318 ; CHECK-NEXT: icmp eq i8 %a, 7
319 define i1 @lshr_eq_opposite_msb(i8 %a) {
320 %shr = lshr i8 -128, %a
321 %cmp = icmp eq i8 %shr, 1
325 ; CHECK-LABEL: @exact_ashr_ne_opposite_msb
326 ; CHECK-NEXT: ret i1 true
327 define i1 @exact_ashr_ne_opposite_msb(i8 %a) {
328 %shr = ashr exact i8 -128, %a
329 %cmp = icmp ne i8 %shr, 1
333 ; CHECK-LABEL: @ashr_ne_opposite_msb
334 ; CHECK-NEXT: ret i1 true
335 define i1 @ashr_ne_opposite_msb(i8 %a) {
336 %shr = ashr i8 -128, %a
337 %cmp = icmp ne i8 %shr, 1
341 ; CHECK-LABEL: @exact_lshr_ne_opposite_msb
342 ; CHECK-NEXT: icmp ne i8 %a, 7
343 define i1 @exact_lshr_ne_opposite_msb(i8 %a) {
344 %shr = lshr exact i8 -128, %a
345 %cmp = icmp ne i8 %shr, 1
349 ; CHECK-LABEL: @lshr_ne_opposite_msb
350 ; CHECK-NEXT: icmp ne i8 %a, 7
351 define i1 @lshr_ne_opposite_msb(i8 %a) {
352 %shr = lshr i8 -128, %a
353 %cmp = icmp ne i8 %shr, 1
357 ; CHECK-LABEL: @exact_ashr_eq_shift_gt
358 ; CHECK-NEXT : ret i1 false
359 define i1 @exact_ashr_eq_shift_gt(i8 %a) {
360 %shr = ashr exact i8 -2, %a
361 %cmp = icmp eq i8 %shr, -8
365 ; CHECK-LABEL: @exact_ashr_ne_shift_gt
366 ; CHECK-NEXT : ret i1 true
367 define i1 @exact_ashr_ne_shift_gt(i8 %a) {
368 %shr = ashr exact i8 -2, %a
369 %cmp = icmp ne i8 %shr, -8
373 ; CHECK-LABEL: @nonexact_ashr_eq_shift_gt
374 ; CHECK-NEXT : ret i1 false
375 define i1 @nonexact_ashr_eq_shift_gt(i8 %a) {
376 %shr = ashr i8 -2, %a
377 %cmp = icmp eq i8 %shr, -8
381 ; CHECK-LABEL: @nonexact_ashr_ne_shift_gt
382 ; CHECK-NEXT : ret i1 true
383 define i1 @nonexact_ashr_ne_shift_gt(i8 %a) {
384 %shr = ashr i8 -2, %a
385 %cmp = icmp ne i8 %shr, -8
389 ; CHECK-LABEL: @exact_lshr_eq_shift_gt
390 ; CHECK-NEXT: ret i1 false
391 define i1 @exact_lshr_eq_shift_gt(i8 %a) {
392 %shr = lshr exact i8 2, %a
393 %cmp = icmp eq i8 %shr, 8
397 ; CHECK-LABEL: @exact_lshr_ne_shift_gt
398 ; CHECK-NEXT: ret i1 true
399 define i1 @exact_lshr_ne_shift_gt(i8 %a) {
400 %shr = lshr exact i8 2, %a
401 %cmp = icmp ne i8 %shr, 8
405 ; CHECK-LABEL: @nonexact_lshr_eq_shift_gt
406 ; CHECK-NEXT : ret i1 false
407 define i1 @nonexact_lshr_eq_shift_gt(i8 %a) {
409 %cmp = icmp eq i8 %shr, 8
413 ; CHECK-LABEL: @nonexact_lshr_ne_shift_gt
414 ; CHECK-NEXT : ret i1 true
415 define i1 @nonexact_lshr_ne_shift_gt(i8 %a) {
417 %cmp = icmp ne i8 %shr, 8
421 ; CHECK-LABEL: @exact_ashr_eq
422 ; CHECK-NEXT: icmp eq i8 %a, 7
423 define i1 @exact_ashr_eq(i8 %a) {
424 %shr = ashr exact i8 -128, %a
425 %cmp = icmp eq i8 %shr, -1
429 ; CHECK-LABEL: @exact_ashr_ne
430 ; CHECK-NEXT: icmp ne i8 %a, 7
431 define i1 @exact_ashr_ne(i8 %a) {
432 %shr = ashr exact i8 -128, %a
433 %cmp = icmp ne i8 %shr, -1
437 ; CHECK-LABEL: @exact_lshr_eq
438 ; CHECK-NEXT: icmp eq i8 %a, 2
439 define i1 @exact_lshr_eq(i8 %a) {
440 %shr = lshr exact i8 4, %a
441 %cmp = icmp eq i8 %shr, 1
445 ; CHECK-LABEL: @exact_lshr_ne
446 ; CHECK-NEXT: icmp ne i8 %a, 2
447 define i1 @exact_lshr_ne(i8 %a) {
448 %shr = lshr exact i8 4, %a
449 %cmp = icmp ne i8 %shr, 1
453 ; CHECK-LABEL: @nonexact_ashr_eq
454 ; CHECK-NEXT: icmp eq i8 %a, 7
455 define i1 @nonexact_ashr_eq(i8 %a) {
456 %shr = ashr i8 -128, %a
457 %cmp = icmp eq i8 %shr, -1
461 ; CHECK-LABEL: @nonexact_ashr_ne
462 ; CHECK-NEXT: icmp ne i8 %a, 7
463 define i1 @nonexact_ashr_ne(i8 %a) {
464 %shr = ashr i8 -128, %a
465 %cmp = icmp ne i8 %shr, -1
469 ; CHECK-LABEL: @nonexact_lshr_eq
470 ; CHECK-NEXT: icmp eq i8 %a, 2
471 define i1 @nonexact_lshr_eq(i8 %a) {
473 %cmp = icmp eq i8 %shr, 1
477 ; CHECK-LABEL: @nonexact_lshr_ne
478 ; CHECK-NEXT: icmp ne i8 %a, 2
479 define i1 @nonexact_lshr_ne(i8 %a) {
481 %cmp = icmp ne i8 %shr, 1
485 ; CHECK-LABEL: @exact_lshr_eq_exactdiv
486 ; CHECK-NEXT: icmp eq i8 %a, 4
487 define i1 @exact_lshr_eq_exactdiv(i8 %a) {
488 %shr = lshr exact i8 80, %a
489 %cmp = icmp eq i8 %shr, 5
493 ; CHECK-LABEL: @exact_lshr_ne_exactdiv
494 ; CHECK-NEXT: icmp ne i8 %a, 4
495 define i1 @exact_lshr_ne_exactdiv(i8 %a) {
496 %shr = lshr exact i8 80, %a
497 %cmp = icmp ne i8 %shr, 5
501 ; CHECK-LABEL: @nonexact_lshr_eq_exactdiv
502 ; CHECK-NEXT: icmp eq i8 %a, 4
503 define i1 @nonexact_lshr_eq_exactdiv(i8 %a) {
504 %shr = lshr i8 80, %a
505 %cmp = icmp eq i8 %shr, 5
509 ; CHECK-LABEL: @nonexact_lshr_ne_exactdiv
510 ; CHECK-NEXT: icmp ne i8 %a, 4
511 define i1 @nonexact_lshr_ne_exactdiv(i8 %a) {
512 %shr = lshr i8 80, %a
513 %cmp = icmp ne i8 %shr, 5
517 ; CHECK-LABEL: @exact_ashr_eq_exactdiv
518 ; CHECK-NEXT: icmp eq i8 %a, 4
519 define i1 @exact_ashr_eq_exactdiv(i8 %a) {
520 %shr = ashr exact i8 -80, %a
521 %cmp = icmp eq i8 %shr, -5
525 ; CHECK-LABEL: @exact_ashr_ne_exactdiv
526 ; CHECK-NEXT: icmp ne i8 %a, 4
527 define i1 @exact_ashr_ne_exactdiv(i8 %a) {
528 %shr = ashr exact i8 -80, %a
529 %cmp = icmp ne i8 %shr, -5
533 ; CHECK-LABEL: @nonexact_ashr_eq_exactdiv
534 ; CHECK-NEXT: icmp eq i8 %a, 4
535 define i1 @nonexact_ashr_eq_exactdiv(i8 %a) {
536 %shr = ashr i8 -80, %a
537 %cmp = icmp eq i8 %shr, -5
541 ; CHECK-LABEL: @nonexact_ashr_ne_exactdiv
542 ; CHECK-NEXT: icmp ne i8 %a, 4
543 define i1 @nonexact_ashr_ne_exactdiv(i8 %a) {
544 %shr = ashr i8 -80, %a
545 %cmp = icmp ne i8 %shr, -5
549 ; CHECK-LABEL: @exact_lshr_eq_noexactdiv
550 ; CHECK-NEXT: ret i1 false
551 define i1 @exact_lshr_eq_noexactdiv(i8 %a) {
552 %shr = lshr exact i8 80, %a
553 %cmp = icmp eq i8 %shr, 31
557 ; CHECK-LABEL: @exact_lshr_ne_noexactdiv
558 ; CHECK-NEXT: ret i1 true
559 define i1 @exact_lshr_ne_noexactdiv(i8 %a) {
560 %shr = lshr exact i8 80, %a
561 %cmp = icmp ne i8 %shr, 31
565 ; CHECK-LABEL: @nonexact_lshr_eq_noexactdiv
566 ; CHECK-NEXT: ret i1 false
567 define i1 @nonexact_lshr_eq_noexactdiv(i8 %a) {
568 %shr = lshr i8 80, %a
569 %cmp = icmp eq i8 %shr, 31
573 ; CHECK-LABEL: @nonexact_lshr_ne_noexactdiv
574 ; CHECK-NEXT: ret i1 true
575 define i1 @nonexact_lshr_ne_noexactdiv(i8 %a) {
576 %shr = lshr i8 80, %a
577 %cmp = icmp ne i8 %shr, 31
581 ; CHECK-LABEL: @exact_ashr_eq_noexactdiv
582 ; CHECK-NEXT: ret i1 false
583 define i1 @exact_ashr_eq_noexactdiv(i8 %a) {
584 %shr = ashr exact i8 -80, %a
585 %cmp = icmp eq i8 %shr, -31
589 ; CHECK-LABEL: @exact_ashr_ne_noexactdiv
590 ; CHECK-NEXT: ret i1 true
591 define i1 @exact_ashr_ne_noexactdiv(i8 %a) {
592 %shr = ashr exact i8 -80, %a
593 %cmp = icmp ne i8 %shr, -31
597 ; CHECK-LABEL: @nonexact_ashr_eq_noexactdiv
598 ; CHECK-NEXT: ret i1 false
599 define i1 @nonexact_ashr_eq_noexactdiv(i8 %a) {
600 %shr = ashr i8 -80, %a
601 %cmp = icmp eq i8 %shr, -31
605 ; CHECK-LABEL: @nonexact_ashr_ne_noexactdiv
606 ; CHECK-NEXT: ret i1 true
607 define i1 @nonexact_ashr_ne_noexactdiv(i8 %a) {
608 %shr = ashr i8 -80, %a
609 %cmp = icmp ne i8 %shr, -31
613 ; CHECK-LABEL: @exact_lshr_eq_noexactlog
614 ; CHECK-NEXT: ret i1 false
615 define i1 @exact_lshr_eq_noexactlog(i8 %a) {
616 %shr = lshr exact i8 90, %a
617 %cmp = icmp eq i8 %shr, 30
621 ; CHECK-LABEL: @exact_lshr_ne_noexactlog
622 ; CHECK-NEXT: ret i1 true
623 define i1 @exact_lshr_ne_noexactlog(i8 %a) {
624 %shr = lshr exact i8 90, %a
625 %cmp = icmp ne i8 %shr, 30
629 ; CHECK-LABEL: @nonexact_lshr_eq_noexactlog
630 ; CHECK-NEXT: ret i1 false
631 define i1 @nonexact_lshr_eq_noexactlog(i8 %a) {
632 %shr = lshr i8 90, %a
633 %cmp = icmp eq i8 %shr, 30
637 ; CHECK-LABEL: @nonexact_lshr_ne_noexactlog
638 ; CHECK-NEXT: ret i1 true
639 define i1 @nonexact_lshr_ne_noexactlog(i8 %a) {
640 %shr = lshr i8 90, %a
641 %cmp = icmp ne i8 %shr, 30
645 ; CHECK-LABEL: @exact_ashr_eq_noexactlog
646 ; CHECK-NEXT: ret i1 false
647 define i1 @exact_ashr_eq_noexactlog(i8 %a) {
648 %shr = ashr exact i8 -90, %a
649 %cmp = icmp eq i8 %shr, -30
653 ; CHECK-LABEL: @exact_ashr_ne_noexactlog
654 ; CHECK-NEXT: ret i1 true
655 define i1 @exact_ashr_ne_noexactlog(i8 %a) {
656 %shr = ashr exact i8 -90, %a
657 %cmp = icmp ne i8 %shr, -30
661 ; CHECK-LABEL: @nonexact_ashr_eq_noexactlog
662 ; CHECK-NEXT: ret i1 false
663 define i1 @nonexact_ashr_eq_noexactlog(i8 %a) {
664 %shr = ashr i8 -90, %a
665 %cmp = icmp eq i8 %shr, -30
669 ; CHECK-LABEL: @nonexact_ashr_ne_noexactlog
670 ; CHECK-NEXT: ret i1 true
671 define i1 @nonexact_ashr_ne_noexactlog(i8 %a) {
672 %shr = ashr i8 -90, %a
673 %cmp = icmp ne i8 %shr, -30
677 ; Don't try to fold the entire body of function @PR20945 into a
678 ; single `ret i1 true` statement.
679 ; If %B is equal to 1, then this function would return false.
680 ; As a consequence, the instruction combiner is not allowed to fold %cmp
681 ; to 'true'. Instead, it should replace %cmp with a simpler comparison
684 ; CHECK-LABEL: @PR20945(
685 ; CHECK: icmp ne i32 %B, 1
686 define i1 @PR20945(i32 %B) {
687 %shr = ashr i32 -9, %B
688 %cmp = icmp ne i32 %shr, -5
692 ; CHECK-LABEL: @PR21222
693 ; CHECK: icmp eq i32 %B, 6
694 define i1 @PR21222(i32 %B) {
695 %shr = ashr i32 -93, %B
696 %cmp = icmp eq i32 %shr, -2