@@ -452,3 +452,178 @@ exit:
452
452
ret i1 %r.10
453
453
}
454
454
455
+ define i1 @test_and_chain_select_ule (i4 %x , i4 %y , i4 %z , i4 %a ) {
456
+ ; CHECK-LABEL: @test_and_chain_select_ule(
457
+ ; CHECK-NEXT: entry:
458
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
459
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
460
+ ; CHECK-NEXT: [[C_3:%.*]] = icmp ule i4 3, [[X]]
461
+ ; CHECK-NEXT: [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
462
+ ; CHECK-NEXT: [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
463
+ ; CHECK-NEXT: [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
464
+ ; CHECK-NEXT: [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
465
+ ; CHECK-NEXT: br i1 [[AND_3]], label [[BB1:%.*]], label [[EXIT:%.*]]
466
+ ; CHECK: bb1:
467
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
468
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i4 [[X]], [[Y]]
469
+ ; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[T_1]], [[T_2]]
470
+ ; CHECK-NEXT: [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
471
+ ; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
472
+ ; CHECK-NEXT: [[T_4:%.*]] = icmp ule i4 3, [[X]]
473
+ ; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[T_4]]
474
+ ; CHECK-NEXT: [[T_5:%.*]] = icmp ule i4 3, [[A]]
475
+ ; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[T_5]]
476
+ ; CHECK-NEXT: [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
477
+ ; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
478
+ ; CHECK-NEXT: ret i1 [[R_5]]
479
+ ; CHECK: exit:
480
+ ; CHECK-NEXT: [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
481
+ ; CHECK-NEXT: [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
482
+ ; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
483
+ ; CHECK-NEXT: [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
484
+ ; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
485
+ ; CHECK-NEXT: [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
486
+ ; CHECK-NEXT: [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
487
+ ; CHECK-NEXT: [[C_10:%.*]] = icmp ule i4 3, [[X]]
488
+ ; CHECK-NEXT: [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
489
+ ; CHECK-NEXT: [[C_11:%.*]] = icmp ule i4 3, [[A]]
490
+ ; CHECK-NEXT: [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
491
+ ; CHECK-NEXT: ret i1 [[R_10]]
492
+ ;
493
+ entry:
494
+ %c.1 = icmp ule i4 %x , %y
495
+ %c.2 = icmp ule i4 %y , %z
496
+ %c.3 = icmp ule i4 3 , %x
497
+ %c.4 = icmp ule i4 3 , %a
498
+ %and.1 = select i1 %c.1 , i1 %c.1 , i1 false
499
+ %and.2 = select i1 %and.1 , i1 %c.3 , i1 false
500
+ %and.3 = select i1 %c.4 , i1 %and.2 , i1 false
501
+ br i1 %and.3 , label %bb1 , label %exit
502
+
503
+ bb1:
504
+ %t.1 = icmp ule i4 %x , %z
505
+ %t.2 = icmp ule i4 %x , %y
506
+ %r.1 = xor i1 %t.1 , %t.2
507
+
508
+ %t.3 = icmp ule i4 %y , %z
509
+ %r.2 = xor i1 %r.1 , %t.3
510
+
511
+ %t.4 = icmp ule i4 3 , %x
512
+ %r.3 = xor i1 %r.2 , %t.4
513
+
514
+ %t.5 = icmp ule i4 3 , %a
515
+ %r.4 = xor i1 %r.3 , %t.5
516
+
517
+ %c.5 = icmp ule i4 %x , %a
518
+ %r.5 = xor i1 %r.4 , %c.5
519
+
520
+ ret i1 %r.5
521
+
522
+ exit:
523
+ %c.6 = icmp ule i4 %x , %z
524
+ %c.7 = icmp ule i4 %x , %a
525
+ %r.6 = xor i1 %c.6 , %c.7
526
+
527
+ %c.8 = icmp ule i4 %x , %y
528
+ %r.7 = xor i1 %r.6 , %c.8
529
+
530
+ %c.9 = icmp ule i4 %y , %z
531
+ %r.8 = xor i1 %r.7 , %c.9
532
+
533
+ %c.10 = icmp ule i4 3 , %x
534
+ %r.9 = xor i1 %r.8 , %c.10
535
+
536
+ %c.11 = icmp ule i4 3 , %a
537
+ %r.10 = xor i1 %r.9 , %c.11
538
+
539
+ ret i1 %r.10
540
+ }
541
+
542
+ define i1 @test_and_chain_select_ule_logical_or (i4 %x , i4 %y , i4 %z , i4 %a ) {
543
+ ; CHECK-LABEL: @test_and_chain_select_ule_logical_or(
544
+ ; CHECK-NEXT: entry:
545
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i4 [[X:%.*]], [[Y:%.*]]
546
+ ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z:%.*]]
547
+ ; CHECK-NEXT: [[C_3:%.*]] = icmp ule i4 3, [[X]]
548
+ ; CHECK-NEXT: [[C_4:%.*]] = icmp ule i4 3, [[A:%.*]]
549
+ ; CHECK-NEXT: [[AND_1:%.*]] = select i1 [[C_1]], i1 [[C_1]], i1 false
550
+ ; CHECK-NEXT: [[AND_2:%.*]] = select i1 [[AND_1]], i1 [[C_3]], i1 false
551
+ ; CHECK-NEXT: [[AND_3:%.*]] = select i1 [[C_4]], i1 [[AND_2]], i1 false
552
+ ; CHECK-NEXT: [[AND_4:%.*]] = select i1 [[AND_3]], i1 true, i1 false
553
+ ; CHECK-NEXT: br i1 [[AND_4]], label [[BB1:%.*]], label [[EXIT:%.*]]
554
+ ; CHECK: bb1:
555
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]]
556
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i4 [[X]], [[Y]]
557
+ ; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[T_1]], [[T_2]]
558
+ ; CHECK-NEXT: [[T_3:%.*]] = icmp ule i4 [[Y]], [[Z]]
559
+ ; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[T_3]]
560
+ ; CHECK-NEXT: [[T_4:%.*]] = icmp ule i4 3, [[X]]
561
+ ; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[T_4]]
562
+ ; CHECK-NEXT: [[T_5:%.*]] = icmp ule i4 3, [[A]]
563
+ ; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[T_5]]
564
+ ; CHECK-NEXT: [[C_5:%.*]] = icmp ule i4 [[X]], [[A]]
565
+ ; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_5]]
566
+ ; CHECK-NEXT: ret i1 [[R_5]]
567
+ ; CHECK: exit:
568
+ ; CHECK-NEXT: [[C_6:%.*]] = icmp ule i4 [[X]], [[Z]]
569
+ ; CHECK-NEXT: [[C_7:%.*]] = icmp ule i4 [[X]], [[A]]
570
+ ; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[C_6]], [[C_7]]
571
+ ; CHECK-NEXT: [[C_8:%.*]] = icmp ule i4 [[X]], [[Y]]
572
+ ; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
573
+ ; CHECK-NEXT: [[C_9:%.*]] = icmp ule i4 [[Y]], [[Z]]
574
+ ; CHECK-NEXT: [[R_8:%.*]] = xor i1 [[R_7]], [[C_9]]
575
+ ; CHECK-NEXT: [[C_10:%.*]] = icmp ule i4 3, [[X]]
576
+ ; CHECK-NEXT: [[R_9:%.*]] = xor i1 [[R_8]], [[C_10]]
577
+ ; CHECK-NEXT: [[C_11:%.*]] = icmp ule i4 3, [[A]]
578
+ ; CHECK-NEXT: [[R_10:%.*]] = xor i1 [[R_9]], [[C_11]]
579
+ ; CHECK-NEXT: ret i1 [[R_10]]
580
+ ;
581
+ entry:
582
+ %c.1 = icmp ule i4 %x , %y
583
+ %c.2 = icmp ule i4 %y , %z
584
+ %c.3 = icmp ule i4 3 , %x
585
+ %c.4 = icmp ule i4 3 , %a
586
+ %and.1 = select i1 %c.1 , i1 %c.1 , i1 false
587
+ %and.2 = select i1 %and.1 , i1 %c.3 , i1 false
588
+ %and.3 = select i1 %c.4 , i1 %and.2 , i1 false
589
+ %and.4 = select i1 %and.3 , i1 true , i1 false
590
+ br i1 %and.4 , label %bb1 , label %exit
591
+
592
+ bb1:
593
+ %t.1 = icmp ule i4 %x , %z
594
+ %t.2 = icmp ule i4 %x , %y
595
+ %r.1 = xor i1 %t.1 , %t.2
596
+
597
+ %t.3 = icmp ule i4 %y , %z
598
+ %r.2 = xor i1 %r.1 , %t.3
599
+
600
+ %t.4 = icmp ule i4 3 , %x
601
+ %r.3 = xor i1 %r.2 , %t.4
602
+
603
+ %t.5 = icmp ule i4 3 , %a
604
+ %r.4 = xor i1 %r.3 , %t.5
605
+
606
+ %c.5 = icmp ule i4 %x , %a
607
+ %r.5 = xor i1 %r.4 , %c.5
608
+
609
+ ret i1 %r.5
610
+
611
+ exit:
612
+ %c.6 = icmp ule i4 %x , %z
613
+ %c.7 = icmp ule i4 %x , %a
614
+ %r.6 = xor i1 %c.6 , %c.7
615
+
616
+ %c.8 = icmp ule i4 %x , %y
617
+ %r.7 = xor i1 %r.6 , %c.8
618
+
619
+ %c.9 = icmp ule i4 %y , %z
620
+ %r.8 = xor i1 %r.7 , %c.9
621
+
622
+ %c.10 = icmp ule i4 3 , %x
623
+ %r.9 = xor i1 %r.8 , %c.10
624
+
625
+ %c.11 = icmp ule i4 3 , %a
626
+ %r.10 = xor i1 %r.9 , %c.11
627
+
628
+ ret i1 %r.10
629
+ }
0 commit comments