@@ -543,6 +543,206 @@ define i8 @and_eq_bits_must_be_set(i8 %x, i8 %y) {
543
543
ret i8 %r
544
544
}
545
545
546
+ define i8 @test_icmp_or (i8 %n , i8 %n2 , i8 %other ) {
547
+ ; CHECK-LABEL: @test_icmp_or(
548
+ ; CHECK-NEXT: entry:
549
+ ; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
550
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_OR]], 32
551
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
552
+ ; CHECK: if.then:
553
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
554
+ ; CHECK-NEXT: ret i8 [[R]]
555
+ ; CHECK: if.else:
556
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
557
+ ;
558
+ entry:
559
+ %n_or = or i8 %n , %n2
560
+ %cmp = icmp ult i8 %n_or , 32
561
+ br i1 %cmp , label %if.then , label %if.else
562
+
563
+ if.then:
564
+ %r = and i8 %n , 32
565
+ ret i8 %r
566
+
567
+ if.else:
568
+ ret i8 %other
569
+ }
570
+
571
+ define i8 @test_icmp_or2 (i8 %n , i8 %n2 , i8 %other ) {
572
+ ; CHECK-LABEL: @test_icmp_or2(
573
+ ; CHECK-NEXT: entry:
574
+ ; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
575
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_OR]], 14
576
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
577
+ ; CHECK: if.then:
578
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
579
+ ; CHECK: if.else:
580
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
581
+ ; CHECK-NEXT: ret i8 [[R]]
582
+ ;
583
+ entry:
584
+ %n_or = or i8 %n , %n2
585
+ %cmp = icmp uge i8 %n_or , 15
586
+ br i1 %cmp , label %if.then , label %if.else
587
+
588
+ if.then:
589
+ ret i8 %other
590
+ if.else:
591
+ %r = and i8 %n , 32
592
+ ret i8 %r
593
+
594
+ }
595
+
596
+ define i8 @test_icmp_or_fail_bad_range (i8 %n , i8 %n2 , i8 %other ) {
597
+ ; CHECK-LABEL: @test_icmp_or_fail_bad_range(
598
+ ; CHECK-NEXT: entry:
599
+ ; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
600
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_OR]], 33
601
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
602
+ ; CHECK: if.then:
603
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
604
+ ; CHECK-NEXT: ret i8 [[R]]
605
+ ; CHECK: if.else:
606
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
607
+ ;
608
+ entry:
609
+ %n_or = or i8 %n , %n2
610
+ %cmp = icmp ule i8 %n_or , 32
611
+ br i1 %cmp , label %if.then , label %if.else
612
+
613
+ if.then:
614
+ %r = and i8 %n , 32
615
+ ret i8 %r
616
+
617
+ if.else:
618
+ ret i8 %other
619
+ }
620
+
621
+ define i8 @test_icmp_or_fail_bad_pred (i8 %n , i8 %n2 , i8 %other ) {
622
+ ; CHECK-LABEL: @test_icmp_or_fail_bad_pred(
623
+ ; CHECK-NEXT: entry:
624
+ ; CHECK-NEXT: [[N_OR:%.*]] = or i8 [[N:%.*]], [[N2:%.*]]
625
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_OR]], 32
626
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
627
+ ; CHECK: if.then:
628
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
629
+ ; CHECK-NEXT: ret i8 [[R]]
630
+ ; CHECK: if.else:
631
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
632
+ ;
633
+ entry:
634
+ %n_or = or i8 %n , %n2
635
+ %cmp = icmp ugt i8 %n_or , 32
636
+ br i1 %cmp , label %if.then , label %if.else
637
+
638
+ if.then:
639
+ %r = and i8 %n , 32
640
+ ret i8 %r
641
+
642
+ if.else:
643
+ ret i8 %other
644
+ }
645
+
646
+ define i8 @test_icmp_and (i8 %n , i8 %n2 , i8 %other ) {
647
+ ; CHECK-LABEL: @test_icmp_and(
648
+ ; CHECK-NEXT: entry:
649
+ ; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
650
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -33
651
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
652
+ ; CHECK: if.then:
653
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
654
+ ; CHECK-NEXT: ret i8 [[R]]
655
+ ; CHECK: if.else:
656
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
657
+ ;
658
+ entry:
659
+ %n_and = and i8 %n , %n2
660
+ %cmp = icmp ugt i8 %n_and , 223
661
+ br i1 %cmp , label %if.then , label %if.else
662
+
663
+ if.then:
664
+ %r = and i8 %n , 32
665
+ ret i8 %r
666
+
667
+ if.else:
668
+ ret i8 %other
669
+ }
670
+
671
+ define i8 @test_icmp_and2 (i8 %n , i8 %n2 , i8 %other ) {
672
+ ; CHECK-LABEL: @test_icmp_and2(
673
+ ; CHECK-NEXT: entry:
674
+ ; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
675
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[N_AND]], -31
676
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
677
+ ; CHECK: if.then:
678
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
679
+ ; CHECK: if.else:
680
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
681
+ ; CHECK-NEXT: ret i8 [[R]]
682
+ ;
683
+ entry:
684
+ %n_and = and i8 %n , %n2
685
+ %cmp = icmp ule i8 %n_and , 224
686
+ br i1 %cmp , label %if.then , label %if.else
687
+
688
+ if.then:
689
+ ret i8 %other
690
+ if.else:
691
+ %r = and i8 %n , 32
692
+ ret i8 %r
693
+
694
+ }
695
+
696
+ define i8 @test_icmp_and_fail_bad_range (i8 %n , i8 %n2 , i8 %other ) {
697
+ ; CHECK-LABEL: @test_icmp_and_fail_bad_range(
698
+ ; CHECK-NEXT: entry:
699
+ ; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
700
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[N_AND]], -34
701
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
702
+ ; CHECK: if.then:
703
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
704
+ ; CHECK-NEXT: ret i8 [[R]]
705
+ ; CHECK: if.else:
706
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
707
+ ;
708
+ entry:
709
+ %n_and = and i8 %n , %n2
710
+ %cmp = icmp uge i8 %n_and , 223
711
+ br i1 %cmp , label %if.then , label %if.else
712
+
713
+ if.then:
714
+ %r = and i8 %n , 32
715
+ ret i8 %r
716
+
717
+ if.else:
718
+ ret i8 %other
719
+ }
720
+
721
+ define i8 @test_icmp_and_fail_bad_pred (i8 %n , i8 %n2 , i8 %other ) {
722
+ ; CHECK-LABEL: @test_icmp_and_fail_bad_pred(
723
+ ; CHECK-NEXT: entry:
724
+ ; CHECK-NEXT: [[N_AND:%.*]] = and i8 [[N:%.*]], [[N2:%.*]]
725
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[N_AND]], 31
726
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
727
+ ; CHECK: if.then:
728
+ ; CHECK-NEXT: [[R:%.*]] = and i8 [[N]], 32
729
+ ; CHECK-NEXT: ret i8 [[R]]
730
+ ; CHECK: if.else:
731
+ ; CHECK-NEXT: ret i8 [[OTHER:%.*]]
732
+ ;
733
+ entry:
734
+ %n_and = and i8 %n , %n2
735
+ %cmp = icmp sge i8 %n_and , 32
736
+ br i1 %cmp , label %if.then , label %if.else
737
+
738
+ if.then:
739
+ %r = and i8 %n , 32
740
+ ret i8 %r
741
+
742
+ if.else:
743
+ ret i8 %other
744
+ }
745
+
546
746
define i8 @and_eq_bits_must_be_set2 (i8 %x , i8 %y ) {
547
747
; CHECK-LABEL: @and_eq_bits_must_be_set2(
548
748
; CHECK-NEXT: [[XY:%.*]] = and i8 [[X:%.*]], [[Y:%.*]]
0 commit comments