1 ; This test makes sure that these instructions are properly eliminated.
4 ; RUN: opt < %s -instcombine -S | FileCheck %s
6 define i32 @test1(i32 %A, i32 %B) {
7 %C = select i1 false, i32 %A, i32 %B
13 define i32 @test2(i32 %A, i32 %B) {
14 %C = select i1 true, i32 %A, i32 %B
16 ; CHECK-LABEL: @test2(
21 define i32 @test3(i1 %C, i32 %I) {
23 %V = select i1 %C, i32 %I, i32 %I
25 ; CHECK-LABEL: @test3(
29 define i1 @test4(i1 %C) {
31 %V = select i1 %C, i1 true, i1 false
33 ; CHECK-LABEL: @test4(
37 define i1 @test5(i1 %C) {
39 %V = select i1 %C, i1 false, i1 true
41 ; CHECK-LABEL: @test5(
42 ; CHECK: xor i1 %C, true
46 define i32 @test6(i1 %C) {
48 %V = select i1 %C, i32 1, i32 0
50 ; CHECK-LABEL: @test6(
51 ; CHECK: %V = zext i1 %C to i32
55 define i1 @test7(i1 %C, i1 %X) {
57 %R = select i1 %C, i1 true, i1 %X
59 ; CHECK-LABEL: @test7(
60 ; CHECK: %R = or i1 %C, %X
64 define i1 @test8(i1 %C, i1 %X) {
66 %R = select i1 %C, i1 %X, i1 false
68 ; CHECK-LABEL: @test8(
69 ; CHECK: %R = and i1 %C, %X
73 define i1 @test9(i1 %C, i1 %X) {
75 %R = select i1 %C, i1 false, i1 %X
77 ; CHECK-LABEL: @test9(
78 ; CHECK: xor i1 %C, true
83 define i1 @test10(i1 %C, i1 %X) {
85 %R = select i1 %C, i1 %X, i1 true
87 ; CHECK-LABEL: @test10(
88 ; CHECK: xor i1 %C, true
93 define i32 @test11(i32 %a) {
94 %C = icmp eq i32 %a, 0
95 %R = select i1 %C, i32 0, i32 1
97 ; CHECK-LABEL: @test11(
98 ; CHECK: icmp ne i32 %a, 0
103 define i32 @test12(i1 %cond, i32 %a) {
105 %c = select i1 %cond, i32 %b, i32 %a
107 ; CHECK-LABEL: @test12(
108 ; CHECK: %b = zext i1 %cond to i32
109 ; CHECK: %c = or i32 %b, %a
113 define i32 @test12a(i1 %cond, i32 %a) {
115 %c = select i1 %cond, i32 %b, i32 %a
117 ; CHECK-LABEL: @test12a(
118 ; CHECK: %b = zext i1 %cond to i32
119 ; CHECK: %c = ashr i32 %a, %b
123 define i32 @test12b(i1 %cond, i32 %a) {
125 %c = select i1 %cond, i32 %a, i32 %b
127 ; CHECK-LABEL: @test12b(
128 ; CHECK: zext i1 %cond to i32
129 ; CHECK: %b = xor i32
130 ; CHECK: %c = ashr i32 %a, %b
134 define i32 @test13(i32 %a, i32 %b) {
135 %C = icmp eq i32 %a, %b
136 %V = select i1 %C, i32 %a, i32 %b
138 ; CHECK-LABEL: @test13(
142 define i32 @test13a(i32 %a, i32 %b) {
143 %C = icmp ne i32 %a, %b
144 %V = select i1 %C, i32 %a, i32 %b
146 ; CHECK-LABEL: @test13a(
150 define i32 @test13b(i32 %a, i32 %b) {
151 %C = icmp eq i32 %a, %b
152 %V = select i1 %C, i32 %b, i32 %a
154 ; CHECK-LABEL: @test13b(
158 define i1 @test14a(i1 %C, i32 %X) {
159 %V = select i1 %C, i32 %X, i32 0
161 %R = icmp slt i32 %V, 1
163 ; CHECK-LABEL: @test14a(
164 ; CHECK: icmp slt i32 %X, 1
165 ; CHECK: xor i1 %C, true
170 define i1 @test14b(i1 %C, i32 %X) {
171 %V = select i1 %C, i32 0, i32 %X
173 %R = icmp slt i32 %V, 1
175 ; CHECK-LABEL: @test14b(
176 ; CHECK: icmp slt i32 %X, 1
181 ;; Code sequence for (X & 16) ? 16 : 0
182 define i32 @test15a(i32 %X) {
184 %t2 = icmp eq i32 %t1, 0
185 %t3 = select i1 %t2, i32 0, i32 16
187 ; CHECK-LABEL: @test15a(
188 ; CHECK: %t1 = and i32 %X, 16
192 ;; Code sequence for (X & 32) ? 0 : 24
193 define i32 @test15b(i32 %X) {
195 %t2 = icmp eq i32 %t1, 0
196 %t3 = select i1 %t2, i32 32, i32 0
198 ; CHECK-LABEL: @test15b(
199 ; CHECK: %t1 = and i32 %X, 32
200 ; CHECK: xor i32 %t1, 32
204 ;; Alternate code sequence for (X & 16) ? 16 : 0
205 define i32 @test15c(i32 %X) {
207 %t2 = icmp eq i32 %t1, 16
208 %t3 = select i1 %t2, i32 16, i32 0
210 ; CHECK-LABEL: @test15c(
211 ; CHECK: %t1 = and i32 %X, 16
215 ;; Alternate code sequence for (X & 16) ? 16 : 0
216 define i32 @test15d(i32 %X) {
218 %t2 = icmp ne i32 %t1, 0
219 %t3 = select i1 %t2, i32 16, i32 0
221 ; CHECK-LABEL: @test15d(
222 ; CHECK: %t1 = and i32 %X, 16
226 ;; (a & 128) ? 256 : 0
227 define i32 @test15e(i32 %X) {
228 %t1 = and i32 %X, 128
229 %t2 = icmp ne i32 %t1, 0
230 %t3 = select i1 %t2, i32 256, i32 0
232 ; CHECK-LABEL: @test15e(
233 ; CHECK: %t1 = shl i32 %X, 1
234 ; CHECK: and i32 %t1, 256
238 ;; (a & 128) ? 0 : 256
239 define i32 @test15f(i32 %X) {
240 %t1 = and i32 %X, 128
241 %t2 = icmp ne i32 %t1, 0
242 %t3 = select i1 %t2, i32 0, i32 256
244 ; CHECK-LABEL: @test15f(
245 ; CHECK: %t1 = shl i32 %X, 1
246 ; CHECK: and i32 %t1, 256
247 ; CHECK: xor i32 %{{.*}}, 256
252 define i32 @test15g(i32 %X) {
254 %t2 = icmp ne i32 %t1, 0
255 %t3 = select i1 %t2, i32 -1, i32 -9
257 ; CHECK-LABEL: @test15g(
258 ; CHECK-NEXT: %1 = or i32 %X, -9
259 ; CHECK-NEXT: ret i32 %1
263 define i32 @test15h(i32 %X) {
265 %t2 = icmp ne i32 %t1, 0
266 %t3 = select i1 %t2, i32 -9, i32 -1
268 ; CHECK-LABEL: @test15h(
269 ; CHECK-NEXT: %1 = or i32 %X, -9
270 ; CHECK-NEXT: %2 = xor i32 %1, 8
271 ; CHECK-NEXT: ret i32 %2
274 ;; (a & 2) ? 577 : 1089
275 define i32 @test15i(i32 %X) {
277 %t2 = icmp ne i32 %t1, 0
278 %t3 = select i1 %t2, i32 577, i32 1089
280 ; CHECK-LABEL: @test15i(
281 ; CHECK-NEXT: %t1 = shl i32 %X, 8
282 ; CHECK-NEXT: %1 = and i32 %t1, 512
283 ; CHECK-NEXT: %2 = xor i32 %1, 512
284 ; CHECK-NEXT: %3 = add nuw nsw i32 %2, 577
285 ; CHECK-NEXT: ret i32 %3
288 ;; (a & 2) ? 1089 : 577
289 define i32 @test15j(i32 %X) {
291 %t2 = icmp ne i32 %t1, 0
292 %t3 = select i1 %t2, i32 1089, i32 577
294 ; CHECK-LABEL: @test15j(
295 ; CHECK-NEXT: %t1 = shl i32 %X, 8
296 ; CHECK-NEXT: %1 = and i32 %t1, 512
297 ; CHECK-NEXT: %2 = add nuw nsw i32 %1, 577
298 ; CHECK-NEXT: ret i32 %2
301 define i32 @test16(i1 %C, i32* %P) {
302 %P2 = select i1 %C, i32* %P, i32* null
305 ; CHECK-LABEL: @test16(
306 ; CHECK-NEXT: %V = load i32* %P
310 define i1 @test17(i32* %X, i1 %C) {
311 %R = select i1 %C, i32* %X, i32* null
312 %RV = icmp eq i32* %R, null
314 ; CHECK-LABEL: @test17(
315 ; CHECK: icmp eq i32* %X, null
316 ; CHECK: xor i1 %C, true
321 define i32 @test18(i32 %X, i32 %Y, i1 %C) {
322 %R = select i1 %C, i32 %X, i32 0
325 ; CHECK-LABEL: @test18(
326 ; CHECK: %V = sdiv i32 %Y, %X
330 define i32 @test19(i32 %x) {
331 %tmp = icmp ugt i32 %x, 2147483647
332 %retval = select i1 %tmp, i32 -1, i32 0
334 ; CHECK-LABEL: @test19(
335 ; CHECK-NEXT: ashr i32 %x, 31
336 ; CHECK-NEXT: ret i32
339 define i32 @test20(i32 %x) {
340 %tmp = icmp slt i32 %x, 0
341 %retval = select i1 %tmp, i32 -1, i32 0
343 ; CHECK-LABEL: @test20(
344 ; CHECK-NEXT: ashr i32 %x, 31
345 ; CHECK-NEXT: ret i32
348 define i64 @test21(i32 %x) {
349 %tmp = icmp slt i32 %x, 0
350 %retval = select i1 %tmp, i64 -1, i64 0
352 ; CHECK-LABEL: @test21(
353 ; CHECK-NEXT: ashr i32 %x, 31
354 ; CHECK-NEXT: sext i32
355 ; CHECK-NEXT: ret i64
358 define i16 @test22(i32 %x) {
359 %tmp = icmp slt i32 %x, 0
360 %retval = select i1 %tmp, i16 -1, i16 0
362 ; CHECK-LABEL: @test22(
363 ; CHECK-NEXT: ashr i32 %x, 31
364 ; CHECK-NEXT: trunc i32
365 ; CHECK-NEXT: ret i16
368 define i1 @test23(i1 %a, i1 %b) {
369 %c = select i1 %a, i1 %b, i1 %a
371 ; CHECK-LABEL: @test23(
372 ; CHECK-NEXT: %c = and i1 %a, %b
373 ; CHECK-NEXT: ret i1 %c
376 define i1 @test24(i1 %a, i1 %b) {
377 %c = select i1 %a, i1 %a, i1 %b
379 ; CHECK-LABEL: @test24(
380 ; CHECK-NEXT: %c = or i1 %a, %b
381 ; CHECK-NEXT: ret i1 %c
384 define i32 @test25(i1 %c) {
386 br i1 %c, label %jump, label %ret
390 %a = phi i1 [true, %jump], [false, %entry]
391 %b = select i1 %a, i32 10, i32 20
393 ; CHECK-LABEL: @test25(
394 ; CHECK: %a = phi i32 [ 10, %jump ], [ 20, %entry ]
395 ; CHECK-NEXT: ret i32 %a
398 define i32 @test26(i1 %cond) {
400 br i1 %cond, label %jump, label %ret
402 %c = or i1 false, false
405 %a = phi i1 [true, %jump], [%c, %entry]
406 %b = select i1 %a, i32 10, i32 20
408 ; CHECK-LABEL: @test26(
409 ; CHECK: %a = phi i32 [ 10, %jump ], [ 20, %entry ]
410 ; CHECK-NEXT: ret i32 %a
413 define i32 @test27(i1 %c, i32 %A, i32 %B) {
415 br i1 %c, label %jump, label %ret
419 %a = phi i1 [true, %jump], [false, %entry]
420 %b = select i1 %a, i32 %A, i32 %B
422 ; CHECK-LABEL: @test27(
423 ; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ]
424 ; CHECK-NEXT: ret i32 %a
427 define i32 @test28(i1 %cond, i32 %A, i32 %B) {
429 br i1 %cond, label %jump, label %ret
433 %c = phi i32 [%A, %jump], [%B, %entry]
434 %a = phi i1 [true, %jump], [false, %entry]
435 %b = select i1 %a, i32 %A, i32 %c
437 ; CHECK-LABEL: @test28(
438 ; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ]
439 ; CHECK-NEXT: ret i32 %a
442 define i32 @test29(i1 %cond, i32 %A, i32 %B) {
444 br i1 %cond, label %jump, label %ret
448 %c = phi i32 [%A, %jump], [%B, %entry]
449 %a = phi i1 [true, %jump], [false, %entry]
453 %b = select i1 %a, i32 %A, i32 %c
455 ; CHECK-LABEL: @test29(
456 ; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ]
461 ; SMAX(SMAX(x, y), x) -> SMAX(x, y)
462 define i32 @test30(i32 %x, i32 %y) {
463 %cmp = icmp sgt i32 %x, %y
464 %cond = select i1 %cmp, i32 %x, i32 %y
466 %cmp5 = icmp sgt i32 %cond, %x
467 %retval = select i1 %cmp5, i32 %cond, i32 %x
469 ; CHECK-LABEL: @test30(
470 ; CHECK: ret i32 %cond
473 ; UMAX(UMAX(x, y), x) -> UMAX(x, y)
474 define i32 @test31(i32 %x, i32 %y) {
475 %cmp = icmp ugt i32 %x, %y
476 %cond = select i1 %cmp, i32 %x, i32 %y
477 %cmp5 = icmp ugt i32 %cond, %x
478 %retval = select i1 %cmp5, i32 %cond, i32 %x
480 ; CHECK-LABEL: @test31(
481 ; CHECK: ret i32 %cond
484 ; SMIN(SMIN(x, y), x) -> SMIN(x, y)
485 define i32 @test32(i32 %x, i32 %y) {
486 %cmp = icmp sgt i32 %x, %y
487 %cond = select i1 %cmp, i32 %y, i32 %x
488 %cmp5 = icmp sgt i32 %cond, %x
489 %retval = select i1 %cmp5, i32 %x, i32 %cond
491 ; CHECK-LABEL: @test32(
492 ; CHECK: ret i32 %cond
495 ; MAX(MIN(x, y), x) -> x
496 define i32 @test33(i32 %x, i32 %y) {
497 %cmp = icmp sgt i32 %x, %y
498 %cond = select i1 %cmp, i32 %y, i32 %x
499 %cmp5 = icmp sgt i32 %cond, %x
500 %retval = select i1 %cmp5, i32 %cond, i32 %x
502 ; CHECK-LABEL: @test33(
506 ; MIN(MAX(x, y), x) -> x
507 define i32 @test34(i32 %x, i32 %y) {
508 %cmp = icmp sgt i32 %x, %y
509 %cond = select i1 %cmp, i32 %x, i32 %y
510 %cmp5 = icmp sgt i32 %cond, %x
511 %retval = select i1 %cmp5, i32 %x, i32 %cond
513 ; CHECK-LABEL: @test34(
517 define i32 @test35(i32 %x) {
518 %cmp = icmp sge i32 %x, 0
519 %cond = select i1 %cmp, i32 60, i32 100
521 ; CHECK-LABEL: @test35(
522 ; CHECK: ashr i32 %x, 31
523 ; CHECK: and i32 {{.*}}, 40
524 ; CHECK: add nuw nsw i32 {{.*}}, 60
528 define i32 @test36(i32 %x) {
529 %cmp = icmp slt i32 %x, 0
530 %cond = select i1 %cmp, i32 60, i32 100
532 ; CHECK-LABEL: @test36(
533 ; CHECK: ashr i32 %x, 31
534 ; CHECK: and i32 {{.*}}, -40
535 ; CHECK: add nsw i32 {{.*}}, 100
539 define i32 @test37(i32 %x) {
540 %cmp = icmp sgt i32 %x, -1
541 %cond = select i1 %cmp, i32 1, i32 -1
543 ; CHECK-LABEL: @test37(
544 ; CHECK: ashr i32 %x, 31
545 ; CHECK: or i32 {{.*}}, 1
549 define i1 @test38(i1 %cond) {
552 %ptr = select i1 %cond, i32* %zero, i32* %one
553 %isnull = icmp eq i32* %ptr, null
555 ; CHECK-LABEL: @test38(
556 ; CHECK: ret i1 false
559 define i1 @test39(i1 %cond, double %x) {
560 %s = select i1 %cond, double %x, double 0x7FF0000000000000 ; RHS = +infty
561 %cmp = fcmp ule double %x, %s
563 ; CHECK-LABEL: @test39(
567 define i1 @test40(i1 %cond) {
571 %s = select i1 %cond, i32* %a, i32* %b
572 %r = icmp eq i32* %s, %c
574 ; CHECK-LABEL: @test40(
575 ; CHECK: ret i1 false
578 define i32 @test41(i1 %cond, i32 %x, i32 %y) {
580 %s = select i1 %cond, i32 %y, i32 %z
583 ; CHECK-LABEL: @test41(
584 ; CHECK-NEXT: and i32 %x, %y
585 ; CHECK-NEXT: ret i32
588 define i32 @test42(i32 %x, i32 %y) {
590 %cond = icmp eq i32 %x, 0
591 %c = select i1 %cond, i32 %b, i32 %y
593 ; CHECK-LABEL: @test42(
594 ; CHECK-NEXT: %cond = icmp eq i32 %x, 0
595 ; CHECK-NEXT: %b = sext i1 %cond to i32
596 ; CHECK-NEXT: %c = add i32 %b, %y
597 ; CHECK-NEXT: ret i32 %c
600 define i64 @test43(i32 %a) nounwind {
601 %a_ext = sext i32 %a to i64
602 %is_a_nonnegative = icmp sgt i32 %a, -1
603 %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 0
605 ; CHECK-LABEL: @test43(
606 ; CHECK-NEXT: %a_ext = sext i32 %a to i64
607 ; CHECK-NEXT: %is_a_nonnegative = icmp slt i64 %a_ext, 0
608 ; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 0, i64 %a_ext
609 ; CHECK-NEXT: ret i64 %max
612 define i64 @test44(i32 %a) nounwind {
613 %a_ext = sext i32 %a to i64
614 %is_a_nonpositive = icmp slt i32 %a, 1
615 %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 0
617 ; CHECK-LABEL: @test44(
618 ; CHECK-NEXT: %a_ext = sext i32 %a to i64
619 ; CHECK-NEXT: %is_a_nonpositive = icmp sgt i64 %a_ext, 0
620 ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 0, i64 %a_ext
621 ; CHECK-NEXT: ret i64 %min
623 define i64 @test45(i32 %a) nounwind {
624 %a_ext = zext i32 %a to i64
625 %is_a_nonnegative = icmp ugt i32 %a, 2
626 %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 3
628 ; CHECK-LABEL: @test45(
629 ; CHECK-NEXT: %a_ext = zext i32 %a to i64
630 ; CHECK-NEXT: %is_a_nonnegative = icmp ult i64 %a_ext, 3
631 ; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 3, i64 %a_ext
632 ; CHECK-NEXT: ret i64 %max
635 define i64 @test46(i32 %a) nounwind {
636 %a_ext = zext i32 %a to i64
637 %is_a_nonpositive = icmp ult i32 %a, 3
638 %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
640 ; CHECK-LABEL: @test46(
641 ; CHECK-NEXT: %a_ext = zext i32 %a to i64
642 ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
643 ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
644 ; CHECK-NEXT: ret i64 %min
646 define i64 @test47(i32 %a) nounwind {
647 %a_ext = sext i32 %a to i64
648 %is_a_nonnegative = icmp ugt i32 %a, 2
649 %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 3
651 ; CHECK-LABEL: @test47(
652 ; CHECK-NEXT: %a_ext = sext i32 %a to i64
653 ; CHECK-NEXT: %is_a_nonnegative = icmp ult i64 %a_ext, 3
654 ; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 3, i64 %a_ext
655 ; CHECK-NEXT: ret i64 %max
658 define i64 @test48(i32 %a) nounwind {
659 %a_ext = sext i32 %a to i64
660 %is_a_nonpositive = icmp ult i32 %a, 3
661 %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
663 ; CHECK-LABEL: @test48(
664 ; CHECK-NEXT: %a_ext = sext i32 %a to i64
665 ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
666 ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
667 ; CHECK-NEXT: ret i64 %min
670 define i64 @test49(i32 %a) nounwind {
671 %a_ext = sext i32 %a to i64
672 %is_a_nonpositive = icmp ult i32 %a, 3
673 %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
675 ; CHECK-LABEL: @test49(
676 ; CHECK-NEXT: %a_ext = sext i32 %a to i64
677 ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
678 ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
679 ; CHECK-NEXT: ret i64 %min
681 define i64 @test50(i32 %a) nounwind {
682 %is_a_nonpositive = icmp ult i32 %a, 3
683 %a_ext = sext i32 %a to i64
684 %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
686 ; CHECK-LABEL: @test50(
687 ; CHECK-NEXT: %a_ext = sext i32 %a to i64
688 ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
689 ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
690 ; CHECK-NEXT: ret i64 %min
695 ; This select instruction can't be eliminated because trying to do so would
696 ; change the number of vector elements. This used to assert.
697 define i48 @test51(<3 x i1> %icmp, <3 x i16> %tmp) {
698 ; CHECK-LABEL: @test51(
699 %select = select <3 x i1> %icmp, <3 x i16> zeroinitializer, <3 x i16> %tmp
700 ; CHECK: select <3 x i1>
701 %tmp2 = bitcast <3 x i16> %select to i48
707 define i32 @test52(i32 %n, i32 %m) nounwind {
708 ; CHECK-LABEL: @test52(
709 %cmp = icmp sgt i32 %n, %m
710 %. = select i1 %cmp, i32 1, i32 3
711 %add = add nsw i32 %., 3
712 %storemerge = select i1 %cmp, i32 %., i32 %add
713 ; CHECK: select i1 %cmp, i32 1, i32 6
718 define i32 @test53(i32 %x) nounwind {
720 %cmp = icmp eq i32 %and, %x
721 %sel = select i1 %cmp, i32 2, i32 1
723 ; CHECK-LABEL: @test53(
724 ; CHECK: select i1 %cmp
728 define i32 @test54(i32 %X, i32 %Y) {
729 %A = ashr exact i32 %X, %Y
730 %B = icmp eq i32 %A, 0
731 %C = select i1 %B, i32 %A, i32 1
733 ; CHECK-LABEL: @test54(
736 ; CHECK: icmp ne i32 %X, 0
741 define i1 @test55(i1 %X, i32 %Y, i32 %Z) {
742 %A = ashr exact i32 %Y, %Z
743 %B = select i1 %X, i32 %Y, i32 %A
744 %C = icmp eq i32 %B, 0
746 ; CHECK-LABEL: @test55(
753 define i32 @test56(i16 %x) nounwind {
754 %tobool = icmp eq i16 %x, 0
755 %conv = zext i16 %x to i32
756 %cond = select i1 %tobool, i32 0, i32 %conv
758 ; CHECK-LABEL: @test56(
763 define i32 @test57(i32 %x, i32 %y) nounwind {
764 %and = and i32 %x, %y
765 %tobool = icmp eq i32 %x, 0
766 %.and = select i1 %tobool, i32 0, i32 %and
768 ; CHECK-LABEL: @test57(
769 ; CHECK-NEXT: and i32 %x, %y
773 define i32 @test58(i16 %x) nounwind {
774 %tobool = icmp ne i16 %x, 1
775 %conv = zext i16 %x to i32
776 %cond = select i1 %tobool, i32 %conv, i32 1
778 ; CHECK-LABEL: @test58(
783 define i32 @test59(i32 %x, i32 %y) nounwind {
784 %and = and i32 %x, %y
785 %tobool = icmp ne i32 %x, %y
786 %.and = select i1 %tobool, i32 %and, i32 %y
788 ; CHECK-LABEL: @test59(
789 ; CHECK-NEXT: and i32 %x, %y
793 define i1 @test60(i32 %x, i1* %y) nounwind {
794 %cmp = icmp eq i32 %x, 0
795 %load = load i1* %y, align 1
796 %cmp1 = icmp slt i32 %x, 1
797 %sel = select i1 %cmp, i1 %load, i1 %cmp1
799 ; CHECK-LABEL: @test60(
803 @glbl = constant i32 10
804 define i32 @test61(i32* %ptr) {
806 %B = icmp eq i32* %ptr, @glbl
807 %C = select i1 %B, i32 %A, i32 10
809 ; CHECK-LABEL: @test61(
813 define i1 @test62(i1 %A, i1 %B) {
814 %not = xor i1 %A, true
815 %C = select i1 %A, i1 %not, i1 %B
817 ; CHECK-LABEL: @test62(
818 ; CHECK: %not = xor i1 %A, true
819 ; CHECK: %C = and i1 %not, %B
823 define i1 @test63(i1 %A, i1 %B) {
824 %not = xor i1 %A, true
825 %C = select i1 %A, i1 %B, i1 %not
827 ; CHECK-LABEL: @test63(
828 ; CHECK: %not = xor i1 %A, true
829 ; CHECK: %C = or i1 %B, %not
834 define void @test64(i32 %p, i16 %b) noreturn nounwind {
836 %p.addr.0.insert.mask = and i32 %p, -65536
837 %conv2 = and i32 %p, 65535
838 br i1 undef, label %lor.rhs, label %lor.end
841 %p.addr.0.extract.trunc = trunc i32 %p.addr.0.insert.mask to i16
842 %phitmp = zext i16 %p.addr.0.extract.trunc to i32
846 %t.1 = phi i32 [ 0, %entry ], [ %phitmp, %lor.rhs ]
847 %conv6 = zext i16 %b to i32
848 %div = udiv i32 %conv6, %t.1
849 %tobool8 = icmp eq i32 %div, 0
850 %cmp = icmp eq i32 %t.1, 0
851 %cmp12 = icmp ult i32 %conv2, 2
852 %cmp.sink = select i1 %tobool8, i1 %cmp12, i1 %cmp
853 br i1 %cmp.sink, label %cond.end17, label %cond.false16
863 ; CHECK-LABEL: @test64(
867 ; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2(
868 ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 %x, 1
869 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], 2
870 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y
871 ; CHECK-NEXT: ret i32 [[OR]]
872 define i32 @select_icmp_eq_and_1_0_or_2(i32 %x, i32 %y) {
874 %cmp = icmp eq i32 %and, 0
876 %select = select i1 %cmp, i32 %y, i32 %or
880 ; CHECK-LABEL: @select_icmp_eq_and_32_0_or_8(
881 ; CHECK-NEXT: [[LSHR:%[a-z0-9]+]] = lshr i32 %x, 2
882 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[LSHR]], 8
883 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y
884 ; CHECK-NEXT: ret i32 [[OR]]
885 define i32 @select_icmp_eq_and_32_0_or_8(i32 %x, i32 %y) {
886 %and = and i32 %x, 32
887 %cmp = icmp eq i32 %and, 0
889 %select = select i1 %cmp, i32 %y, i32 %or
893 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_4096(
894 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 4096
895 ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 4096
896 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
897 ; CHECK-NEXT: ret i32 [[OR]]
898 define i32 @select_icmp_ne_0_and_4096_or_4096(i32 %x, i32 %y) {
899 %and = and i32 %x, 4096
900 %cmp = icmp ne i32 0, %and
901 %or = or i32 %y, 4096
902 %select = select i1 %cmp, i32 %y, i32 %or
906 ; CHECK-LABEL: @select_icmp_eq_and_4096_0_or_4096(
907 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 4096
908 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y
909 ; CHECK-NEXT: ret i32 [[OR]]
910 define i32 @select_icmp_eq_and_4096_0_or_4096(i32 %x, i32 %y) {
911 %and = and i32 %x, 4096
912 %cmp = icmp eq i32 %and, 0
913 %or = or i32 %y, 4096
914 %select = select i1 %cmp, i32 %y, i32 %or
918 ; CHECK-LABEL: @select_icmp_eq_0_and_1_or_1(
919 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i64 %x, 1
920 ; CHECK-NEXT: [[ZEXT:%[a-z0-9]+]] = trunc i64 [[AND]] to i32
921 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
922 ; CHECK-NEXT: ret i32 [[OR]]
923 define i32 @select_icmp_eq_0_and_1_or_1(i64 %x, i32 %y) {
925 %cmp = icmp eq i64 %and, 0
927 %select = select i1 %cmp, i32 %y, i32 %or
931 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_32(
932 ; CHECK-NEXT: [[LSHR:%[a-z0-9]+]] = lshr i32 %x, 7
933 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[LSHR]], 32
934 ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 32
935 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
936 ; CHECK-NEXT: ret i32 [[OR]]
937 define i32 @select_icmp_ne_0_and_4096_or_32(i32 %x, i32 %y) {
938 %and = and i32 %x, 4096
939 %cmp = icmp ne i32 0, %and
941 %select = select i1 %cmp, i32 %y, i32 %or
945 ; CHECK-LABEL: @select_icmp_ne_0_and_32_or_4096(
946 ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 %x, 7
947 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], 4096
948 ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 4096
949 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
950 ; CHECK-NEXT: ret i32 [[OR]]
951 define i32 @select_icmp_ne_0_and_32_or_4096(i32 %x, i32 %y) {
952 %and = and i32 %x, 32
953 %cmp = icmp ne i32 0, %and
954 %or = or i32 %y, 4096
955 %select = select i1 %cmp, i32 %y, i32 %or
959 ; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_or_8(
960 ; CHECK-NEXT: [[LSHR:%[a-z0-9]+]] = lshr i32 %x, 27
961 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[LSHR]], 8
962 ; CHECK-NEXT: [[TRUNC:%[a-z0-9]+]] = trunc i32 [[AND]] to i8
963 ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i8 [[TRUNC]], 8
964 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i8 [[XOR]], %y
965 ; CHECK-NEXT: ret i8 [[OR]]
966 define i8 @select_icmp_ne_0_and_1073741824_or_8(i32 %x, i8 %y) {
967 %and = and i32 %x, 1073741824
968 %cmp = icmp ne i32 0, %and
970 %select = select i1 %cmp, i8 %y, i8 %or
974 ; CHECK-LABEL: @select_icmp_ne_0_and_8_or_1073741824(
975 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i8 %x, 8
976 ; CHECK-NEXT: [[ZEXT:%[a-z0-9]+]] = zext i8 [[AND]] to i32
977 ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl nuw nsw i32 [[ZEXT]], 27
978 ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[SHL]], 1073741824
979 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
980 ; CHECK-NEXT: ret i32 [[OR]]
981 define i32 @select_icmp_ne_0_and_8_or_1073741824(i8 %x, i32 %y) {
983 %cmp = icmp ne i8 0, %and
984 %or = or i32 %y, 1073741824
985 %select = select i1 %cmp, i32 %y, i32 %or
989 ; We can't combine here, because the cmp is scalar and the or vector.
990 ; Just make sure we don't assert.
991 define <2 x i32> @select_icmp_eq_and_1_0_or_vector_of_2s(i32 %x, <2 x i32> %y) {
993 %cmp = icmp eq i32 %and, 0
994 %or = or <2 x i32> %y, <i32 2, i32 2>
995 %select = select i1 %cmp, <2 x i32> %y, <2 x i32> %or
996 ret <2 x i32> %select
999 ; CHECK-LABEL: @select_icmp_and_8_eq_0_or_8(
1000 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, 8
1001 ; CHECK-NEXT: ret i32 [[OR]]
1002 define i32 @select_icmp_and_8_eq_0_or_8(i32 %x) {
1003 %and = and i32 %x, 8
1004 %cmp = icmp eq i32 %and, 0
1006 %or.x = select i1 %cmp, i32 %or, i32 %x
1010 ; CHECK-LABEL: @select_icmp_and_8_ne_0_xor_8(
1011 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, -9
1012 ; CHECK-NEXT: ret i32 [[AND]]
1013 define i32 @select_icmp_and_8_ne_0_xor_8(i32 %x) {
1014 %and = and i32 %x, 8
1015 %cmp = icmp eq i32 %and, 0
1016 %xor = xor i32 %x, 8
1017 %x.xor = select i1 %cmp, i32 %x, i32 %xor
1021 ; CHECK-LABEL: @select_icmp_and_8_eq_0_xor_8(
1022 ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, 8
1023 ; CHECK-NEXT: ret i32 [[OR]]
1024 define i32 @select_icmp_and_8_eq_0_xor_8(i32 %x) {
1025 %and = and i32 %x, 8
1026 %cmp = icmp eq i32 %and, 0
1027 %xor = xor i32 %x, 8
1028 %xor.x = select i1 %cmp, i32 %xor, i32 %x
1032 ; CHECK-LABEL: @select_icmp_and_8_ne_0_and_not_8(
1033 ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, -9
1034 ; CHECK-NEXT: ret i32 [[AND]]
1035 define i32 @select_icmp_and_8_ne_0_and_not_8(i32 %x) {
1036 %and = and i32 %x, 8
1037 %cmp = icmp eq i32 %and, 0
1038 %and1 = and i32 %x, -9
1039 %x.and1 = select i1 %cmp, i32 %x, i32 %and1
1043 ; CHECK-LABEL: @select_icmp_and_8_eq_0_and_not_8(
1044 ; CHECK-NEXT: ret i32 %x
1045 define i32 @select_icmp_and_8_eq_0_and_not_8(i32 %x) {
1046 %and = and i32 %x, 8
1047 %cmp = icmp eq i32 %and, 0
1048 %and1 = and i32 %x, -9
1049 %and1.x = select i1 %cmp, i32 %and1, i32 %x
1053 ; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_xor_8(
1054 ; CHECK: select i1 %cmp, i64 %y, i64 %xor
1055 define i64 @select_icmp_x_and_8_eq_0_y_xor_8(i32 %x, i64 %y) {
1056 %and = and i32 %x, 8
1057 %cmp = icmp eq i32 %and, 0
1058 %xor = xor i64 %y, 8
1059 %y.xor = select i1 %cmp, i64 %y, i64 %xor
1063 ; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_and_not_8(
1064 ; CHECK: select i1 %cmp, i64 %y, i64 %and1
1065 define i64 @select_icmp_x_and_8_eq_0_y_and_not_8(i32 %x, i64 %y) {
1066 %and = and i32 %x, 8
1067 %cmp = icmp eq i32 %and, 0
1068 %and1 = and i64 %y, -9
1069 %y.and1 = select i1 %cmp, i64 %y, i64 %and1
1073 ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_xor_8(
1074 ; CHECK: select i1 %cmp, i64 %xor, i64 %y
1075 define i64 @select_icmp_x_and_8_ne_0_y_xor_8(i32 %x, i64 %y) {
1076 %and = and i32 %x, 8
1077 %cmp = icmp eq i32 %and, 0
1078 %xor = xor i64 %y, 8
1079 %xor.y = select i1 %cmp, i64 %xor, i64 %y
1083 ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_and_not_8(
1084 ; CHECK: select i1 %cmp, i64 %and1, i64 %y
1085 define i64 @select_icmp_x_and_8_ne_0_y_and_not_8(i32 %x, i64 %y) {
1086 %and = and i32 %x, 8
1087 %cmp = icmp eq i32 %and, 0
1088 %and1 = and i64 %y, -9
1089 %and1.y = select i1 %cmp, i64 %and1, i64 %y
1093 ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_or_8(
1094 ; CHECK: xor i64 %1, 8
1095 ; CHECK: or i64 %2, %y
1096 define i64 @select_icmp_x_and_8_ne_0_y_or_8(i32 %x, i64 %y) {
1097 %and = and i32 %x, 8
1098 %cmp = icmp eq i32 %and, 0
1100 %or.y = select i1 %cmp, i64 %or, i64 %y
1104 define i32 @test65(i64 %x) {
1106 %2 = icmp ne i64 %1, 0
1107 %3 = select i1 %2, i32 40, i32 42
1110 ; CHECK-LABEL: @test65(
1111 ; CHECK: and i64 %x, 16
1112 ; CHECK: trunc i64 %1 to i32
1113 ; CHECK: lshr exact i32 %2, 3
1114 ; CHECK: xor i32 %3, 42
1117 define i32 @test66(i64 %x) {
1118 %1 = and i64 %x, 4294967296
1119 %2 = icmp ne i64 %1, 0
1120 %3 = select i1 %2, i32 40, i32 42
1123 ; CHECK-LABEL: @test66(
1127 define i32 @test67(i16 %x) {
1129 %2 = icmp ne i16 %1, 0
1130 %3 = select i1 %2, i32 40, i32 42
1133 ; CHECK-LABEL: @test67(
1134 ; CHECK: and i16 %x, 4
1135 ; CHECK: zext i16 %1 to i32
1136 ; CHECK: lshr exact i32 %2, 1
1137 ; CHECK: xor i32 %3, 42
1140 ; SMIN(SMIN(X, 11), 92) -> SMIN(X, 11)
1141 define i32 @test68(i32 %x) {
1143 %cmp = icmp slt i32 11, %x
1144 %cond = select i1 %cmp, i32 11, i32 %x
1145 %cmp3 = icmp slt i32 92, %cond
1146 %retval = select i1 %cmp3, i32 92, i32 %cond
1148 ; CHECK-LABEL: @test68(
1149 ; CHECK: ret i32 %cond
1152 ; MIN(MIN(X, 24), 83) -> MIN(X, 24)
1153 define i32 @test69(i32 %x) {
1155 %cmp = icmp ult i32 24, %x
1156 %cond = select i1 %cmp, i32 24, i32 %x
1157 %cmp3 = icmp ult i32 83, %cond
1158 %retval = select i1 %cmp3, i32 83, i32 %cond
1160 ; CHECK-LABEL: @test69(
1161 ; CHECK: ret i32 %cond
1164 ; SMAX(SMAX(X, 75), 36) -> SMAX(X, 75)
1165 define i32 @test70(i32 %x) {
1167 %cmp = icmp slt i32 %x, 75
1168 %cond = select i1 %cmp, i32 75, i32 %x
1169 %cmp3 = icmp slt i32 %cond, 36
1170 %retval = select i1 %cmp3, i32 36, i32 %cond
1172 ; CHECK-LABEL: @test70(
1173 ; CHECK: ret i32 %cond
1176 ; MAX(MAX(X, 68), 47) -> MAX(X, 68)
1177 define i32 @test71(i32 %x) {
1179 %cmp = icmp ult i32 %x, 68
1180 %cond = select i1 %cmp, i32 68, i32 %x
1181 %cmp3 = icmp ult i32 %cond, 47
1182 %retval = select i1 %cmp3, i32 47, i32 %cond
1184 ; CHECK-LABEL: @test71(
1185 ; CHECK: ret i32 %cond
1188 ; SMIN(SMIN(X, 92), 11) -> SMIN(X, 11)
1189 define i32 @test72(i32 %x) {
1190 %cmp = icmp sgt i32 %x, 92
1191 %cond = select i1 %cmp, i32 92, i32 %x
1192 %cmp3 = icmp sgt i32 %cond, 11
1193 %retval = select i1 %cmp3, i32 11, i32 %cond
1195 ; CHECK-LABEL: @test72(
1196 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 11
1197 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 11, i32 %x
1198 ; CHECK-NEXT: ret i32 [[SEL]]
1201 ; MIN(MIN(X, 83), 24) -> MIN(X, 24)
1202 define i32 @test73(i32 %x) {
1203 %cmp = icmp ugt i32 %x, 83
1204 %cond = select i1 %cmp, i32 83, i32 %x
1205 %cmp3 = icmp ugt i32 %cond, 24
1206 %retval = select i1 %cmp3, i32 24, i32 %cond
1208 ; CHECK-LABEL: @test73(
1209 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %x, 24
1210 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 24, i32 %x
1211 ; CHECK-NEXT: ret i32 [[SEL]]
1214 ; SMAX(SMAX(X, 36), 75) -> SMAX(X, 75)
1215 define i32 @test74(i32 %x) {
1216 %cmp = icmp slt i32 %x, 36
1217 %cond = select i1 %cmp, i32 36, i32 %x
1218 %cmp3 = icmp slt i32 %cond, 75
1219 %retval = select i1 %cmp3, i32 75, i32 %cond
1221 ; CHECK-LABEL: @test74(
1222 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 75
1223 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 75, i32 %x
1224 ; CHECK-NEXT: ret i32 [[SEL]]
1227 ; MAX(MAX(X, 47), 68) -> MAX(X, 68)
1228 define i32 @test75(i32 %x) {
1229 %cmp = icmp ult i32 %x, 47
1230 %cond = select i1 %cmp, i32 47, i32 %x
1231 %cmp3 = icmp ult i32 %cond, 68
1232 %retval = select i1 %cmp3, i32 68, i32 %cond
1234 ; CHECK-LABEL: @test75(
1235 ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %x, 68
1236 ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 68, i32 %x
1237 ; CHECK-NEXT: ret i32 [[SEL]]