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
423 ; CHECK-LABEL: @exact_ashr_eq
424 ; CHECK-NEXT: icmp eq i8 %a, 7
425 define i1 @exact_ashr_eq(i8 %a) {
426 %shr = ashr exact i8 -128, %a
427 %cmp = icmp eq i8 %shr, -1
431 ; CHECK-LABEL: @exact_ashr_ne
432 ; CHECK-NEXT: icmp ne i8 %a, 7
433 define i1 @exact_ashr_ne(i8 %a) {
434 %shr = ashr exact i8 -128, %a
435 %cmp = icmp ne i8 %shr, -1
439 ; CHECK-LABEL: @exact_lshr_eq
440 ; CHECK-NEXT: icmp eq i8 %a, 2
441 define i1 @exact_lshr_eq(i8 %a) {
442 %shr = lshr exact i8 4, %a
443 %cmp = icmp eq i8 %shr, 1
447 ; CHECK-LABEL: @exact_lshr_ne
448 ; CHECK-NEXT: icmp ne i8 %a, 2
449 define i1 @exact_lshr_ne(i8 %a) {
450 %shr = lshr exact i8 4, %a
451 %cmp = icmp ne i8 %shr, 1
455 ; CHECK-LABEL: @nonexact_ashr_eq
456 ; CHECK-NEXT: icmp eq i8 %a, 7
457 define i1 @nonexact_ashr_eq(i8 %a) {
458 %shr = ashr i8 -128, %a
459 %cmp = icmp eq i8 %shr, -1
463 ; CHECK-LABEL: @nonexact_ashr_ne
464 ; CHECK-NEXT: icmp ne i8 %a, 7
465 define i1 @nonexact_ashr_ne(i8 %a) {
466 %shr = ashr i8 -128, %a
467 %cmp = icmp ne i8 %shr, -1
471 ; CHECK-LABEL: @nonexact_lshr_eq
472 ; CHECK-NEXT: icmp eq i8 %a, 2
473 define i1 @nonexact_lshr_eq(i8 %a) {
475 %cmp = icmp eq i8 %shr, 1
479 ; CHECK-LABEL: @nonexact_lshr_ne
480 ; CHECK-NEXT: icmp ne i8 %a, 2
481 define i1 @nonexact_lshr_ne(i8 %a) {
483 %cmp = icmp ne i8 %shr, 1
487 ; CHECK-LABEL: @exact_lshr_eq_exactdiv
488 ; CHECK-NEXT: icmp eq i8 %a, 4
489 define i1 @exact_lshr_eq_exactdiv(i8 %a) {
490 %shr = lshr exact i8 80, %a
491 %cmp = icmp eq i8 %shr, 5
495 ; CHECK-LABEL: @exact_lshr_ne_exactdiv
496 ; CHECK-NEXT: icmp ne i8 %a, 4
497 define i1 @exact_lshr_ne_exactdiv(i8 %a) {
498 %shr = lshr exact i8 80, %a
499 %cmp = icmp ne i8 %shr, 5
503 ; CHECK-LABEL: @nonexact_lshr_eq_exactdiv
504 ; CHECK-NEXT: icmp eq i8 %a, 4
505 define i1 @nonexact_lshr_eq_exactdiv(i8 %a) {
506 %shr = lshr i8 80, %a
507 %cmp = icmp eq i8 %shr, 5
511 ; CHECK-LABEL: @nonexact_lshr_ne_exactdiv
512 ; CHECK-NEXT: icmp ne i8 %a, 4
513 define i1 @nonexact_lshr_ne_exactdiv(i8 %a) {
514 %shr = lshr i8 80, %a
515 %cmp = icmp ne i8 %shr, 5
519 ; CHECK-LABEL: @exact_ashr_eq_exactdiv
520 ; CHECK-NEXT: icmp eq i8 %a, 4
521 define i1 @exact_ashr_eq_exactdiv(i8 %a) {
522 %shr = ashr exact i8 -80, %a
523 %cmp = icmp eq i8 %shr, -5
527 ; CHECK-LABEL: @exact_ashr_ne_exactdiv
528 ; CHECK-NEXT: icmp ne i8 %a, 4
529 define i1 @exact_ashr_ne_exactdiv(i8 %a) {
530 %shr = ashr exact i8 -80, %a
531 %cmp = icmp ne i8 %shr, -5
535 ; CHECK-LABEL: @nonexact_ashr_eq_exactdiv
536 ; CHECK-NEXT: icmp eq i8 %a, 4
537 define i1 @nonexact_ashr_eq_exactdiv(i8 %a) {
538 %shr = ashr i8 -80, %a
539 %cmp = icmp eq i8 %shr, -5
543 ; CHECK-LABEL: @nonexact_ashr_ne_exactdiv
544 ; CHECK-NEXT: icmp ne i8 %a, 4
545 define i1 @nonexact_ashr_ne_exactdiv(i8 %a) {
546 %shr = ashr i8 -80, %a
547 %cmp = icmp ne i8 %shr, -5
551 ; CHECK-LABEL: @exact_lshr_eq_noexactdiv
552 ; CHECK-NEXT: ret i1 false
553 define i1 @exact_lshr_eq_noexactdiv(i8 %a) {
554 %shr = lshr exact i8 80, %a
555 %cmp = icmp eq i8 %shr, 31
559 ; CHECK-LABEL: @exact_lshr_ne_noexactdiv
560 ; CHECK-NEXT: ret i1 true
561 define i1 @exact_lshr_ne_noexactdiv(i8 %a) {
562 %shr = lshr exact i8 80, %a
563 %cmp = icmp ne i8 %shr, 31
567 ; CHECK-LABEL: @nonexact_lshr_eq_noexactdiv
568 ; CHECK-NEXT: ret i1 false
569 define i1 @nonexact_lshr_eq_noexactdiv(i8 %a) {
570 %shr = lshr i8 80, %a
571 %cmp = icmp eq i8 %shr, 31
575 ; CHECK-LABEL: @nonexact_lshr_ne_noexactdiv
576 ; CHECK-NEXT: ret i1 true
577 define i1 @nonexact_lshr_ne_noexactdiv(i8 %a) {
578 %shr = lshr i8 80, %a
579 %cmp = icmp ne i8 %shr, 31
583 ; CHECK-LABEL: @exact_ashr_eq_noexactdiv
584 ; CHECK-NEXT: ret i1 false
585 define i1 @exact_ashr_eq_noexactdiv(i8 %a) {
586 %shr = ashr exact i8 -80, %a
587 %cmp = icmp eq i8 %shr, -31
591 ; CHECK-LABEL: @exact_ashr_ne_noexactdiv
592 ; CHECK-NEXT: ret i1 true
593 define i1 @exact_ashr_ne_noexactdiv(i8 %a) {
594 %shr = ashr exact i8 -80, %a
595 %cmp = icmp ne i8 %shr, -31
599 ; CHECK-LABEL: @nonexact_ashr_eq_noexactdiv
600 ; CHECK-NEXT: ret i1 false
601 define i1 @nonexact_ashr_eq_noexactdiv(i8 %a) {
602 %shr = ashr i8 -80, %a
603 %cmp = icmp eq i8 %shr, -31
607 ; CHECK-LABEL: @nonexact_ashr_ne_noexactdiv
608 ; CHECK-NEXT: ret i1 true
609 define i1 @nonexact_ashr_ne_noexactdiv(i8 %a) {
610 %shr = ashr i8 -80, %a
611 %cmp = icmp ne i8 %shr, -31
615 ; CHECK-LABEL: @exact_lshr_eq_noexactlog
616 ; CHECK-NEXT: ret i1 false
617 define i1 @exact_lshr_eq_noexactlog(i8 %a) {
618 %shr = lshr exact i8 90, %a
619 %cmp = icmp eq i8 %shr, 30
623 ; CHECK-LABEL: @exact_lshr_ne_noexactlog
624 ; CHECK-NEXT: ret i1 true
625 define i1 @exact_lshr_ne_noexactlog(i8 %a) {
626 %shr = lshr exact i8 90, %a
627 %cmp = icmp ne i8 %shr, 30
631 ; CHECK-LABEL: @nonexact_lshr_eq_noexactlog
632 ; CHECK-NEXT: ret i1 false
633 define i1 @nonexact_lshr_eq_noexactlog(i8 %a) {
634 %shr = lshr i8 90, %a
635 %cmp = icmp eq i8 %shr, 30
639 ; CHECK-LABEL: @nonexact_lshr_ne_noexactlog
640 ; CHECK-NEXT: ret i1 true
641 define i1 @nonexact_lshr_ne_noexactlog(i8 %a) {
642 %shr = lshr i8 90, %a
643 %cmp = icmp ne i8 %shr, 30
647 ; CHECK-LABEL: @exact_ashr_eq_noexactlog
648 ; CHECK-NEXT: ret i1 false
649 define i1 @exact_ashr_eq_noexactlog(i8 %a) {
650 %shr = ashr exact i8 -90, %a
651 %cmp = icmp eq i8 %shr, -30
655 ; CHECK-LABEL: @exact_ashr_ne_noexactlog
656 ; CHECK-NEXT: ret i1 true
657 define i1 @exact_ashr_ne_noexactlog(i8 %a) {
658 %shr = ashr exact i8 -90, %a
659 %cmp = icmp ne i8 %shr, -30
663 ; CHECK-LABEL: @nonexact_ashr_eq_noexactlog
664 ; CHECK-NEXT: ret i1 false
665 define i1 @nonexact_ashr_eq_noexactlog(i8 %a) {
666 %shr = ashr i8 -90, %a
667 %cmp = icmp eq i8 %shr, -30
671 ; CHECK-LABEL: @nonexact_ashr_ne_noexactlog
672 ; CHECK-NEXT: ret i1 true
673 define i1 @nonexact_ashr_ne_noexactlog(i8 %a) {
674 %shr = ashr i8 -90, %a
675 %cmp = icmp ne i8 %shr, -30
679 ; Don't try to fold the entire body of function @PR20945 into a
680 ; single `ret i1 true` statement.
681 ; If %B is equal to 1, then this function would return false.
682 ; As a consequence, the instruction combiner is not allowed to fold %cmp
683 ; to 'true'. Instead, it should replace %cmp with a simpler comparison
686 ; CHECK-LABEL: @PR20945(
687 ; CHECK: icmp ne i32 %B, 1
688 define i1 @PR20945(i32 %B) {
689 %shr = ashr i32 -9, %B
690 %cmp = icmp ne i32 %shr, -5