@@ -628,3 +628,141 @@ define i1 @icmp_slt_select(i1 %cond, i32 %a, i32 %b) {
628
628
%res = icmp slt i32 %lhs , %rhs
629
629
ret i1 %res
630
630
}
631
+
632
+ define i1 @discr_eq (i8 %a , i8 %b ) {
633
+ ; CHECK-LABEL: @discr_eq(
634
+ ; CHECK-NEXT: entry:
635
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[A:%.*]], -2
636
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A]], 1
637
+ ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[ADD1]], i8 1
638
+ ; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[B:%.*]], -2
639
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B]], 1
640
+ ; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i8 [[ADD2]], i8 1
641
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[SEL1]], [[SEL2]]
642
+ ; CHECK-NEXT: ret i1 [[RES]]
643
+ ;
644
+ entry:
645
+ %add1 = add i8 %a , -2
646
+ %cmp1 = icmp ugt i8 %a , 1
647
+ %sel1 = select i1 %cmp1 , i8 %add1 , i8 1
648
+ %add2 = add i8 %b , -2
649
+ %cmp2 = icmp ugt i8 %b , 1
650
+ %sel2 = select i1 %cmp2 , i8 %add2 , i8 1
651
+ %res = icmp eq i8 %sel1 , %sel2
652
+ ret i1 %res
653
+ }
654
+
655
+ define i1 @discr_ne (i8 %a , i8 %b ) {
656
+ ; CHECK-LABEL: @discr_ne(
657
+ ; CHECK-NEXT: entry:
658
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[A:%.*]], -2
659
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A]], 1
660
+ ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[ADD1]], i8 1
661
+ ; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[B:%.*]], -2
662
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B]], 1
663
+ ; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i8 [[ADD2]], i8 1
664
+ ; CHECK-NEXT: [[RES:%.*]] = icmp ne i8 [[SEL1]], [[SEL2]]
665
+ ; CHECK-NEXT: ret i1 [[RES]]
666
+ ;
667
+ entry:
668
+ %add1 = add i8 %a , -2
669
+ %cmp1 = icmp ugt i8 %a , 1
670
+ %sel1 = select i1 %cmp1 , i8 %add1 , i8 1
671
+ %add2 = add i8 %b , -2
672
+ %cmp2 = icmp ugt i8 %b , 1
673
+ %sel2 = select i1 %cmp2 , i8 %add2 , i8 1
674
+ %res = icmp ne i8 %sel1 , %sel2
675
+ ret i1 %res
676
+ }
677
+
678
+ define i1 @discr_xor_eq (i8 %a , i8 %b ) {
679
+ ; CHECK-LABEL: @discr_xor_eq(
680
+ ; CHECK-NEXT: entry:
681
+ ; CHECK-NEXT: [[XOR1:%.*]] = xor i8 [[A:%.*]], -3
682
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A]], 1
683
+ ; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[CMP1]], i8 [[XOR1]], i8 1
684
+ ; CHECK-NEXT: [[XOR2:%.*]] = xor i8 [[B:%.*]], -3
685
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B]], 1
686
+ ; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[CMP2]], i8 [[XOR2]], i8 1
687
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]]
688
+ ; CHECK-NEXT: ret i1 [[RES]]
689
+ ;
690
+ entry:
691
+ %xor1 = xor i8 %a , -3
692
+ %cmp1 = icmp ugt i8 %a , 1
693
+ %sel1 = select i1 %cmp1 , i8 %xor1 , i8 1
694
+ %xor2 = xor i8 %b , -3
695
+ %cmp2 = icmp ugt i8 %b , 1
696
+ %sel2 = select i1 %cmp2 , i8 %xor2 , i8 1
697
+ %res = icmp eq i8 %sel1 , %sel2
698
+ ret i1 %res
699
+ }
700
+
701
+ define i1 @discr_eq_simple (i8 %a , i8 %b ) {
702
+ ; CHECK-LABEL: @discr_eq_simple(
703
+ ; CHECK-NEXT: entry:
704
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[A:%.*]], -2
705
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A]], 1
706
+ ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[ADD1]], i8 1
707
+ ; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[B:%.*]], -2
708
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[SEL1]], [[ADD2]]
709
+ ; CHECK-NEXT: ret i1 [[RES]]
710
+ ;
711
+ entry:
712
+ %add1 = add i8 %a , -2
713
+ %cmp1 = icmp ugt i8 %a , 1
714
+ %sel1 = select i1 %cmp1 , i8 %add1 , i8 1
715
+ %add2 = add i8 %b , -2
716
+ %res = icmp eq i8 %sel1 , %add2
717
+ ret i1 %res
718
+ }
719
+
720
+ ; Negative tests
721
+
722
+ define i1 @discr_eq_multi_use (i8 %a , i8 %b ) {
723
+ ; CHECK-LABEL: @discr_eq_multi_use(
724
+ ; CHECK-NEXT: entry:
725
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[A:%.*]], -2
726
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A]], 1
727
+ ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[ADD1]], i8 1
728
+ ; CHECK-NEXT: call void @use(i8 [[SEL1]])
729
+ ; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[B:%.*]], -2
730
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B]], 1
731
+ ; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i8 [[ADD2]], i8 1
732
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[SEL1]], [[SEL2]]
733
+ ; CHECK-NEXT: ret i1 [[RES]]
734
+ ;
735
+ entry:
736
+ %add1 = add i8 %a , -2
737
+ %cmp1 = icmp ugt i8 %a , 1
738
+ %sel1 = select i1 %cmp1 , i8 %add1 , i8 1
739
+ call void @use (i8 %sel1 )
740
+ %add2 = add i8 %b , -2
741
+ %cmp2 = icmp ugt i8 %b , 1
742
+ %sel2 = select i1 %cmp2 , i8 %add2 , i8 1
743
+ %res = icmp eq i8 %sel1 , %sel2
744
+ ret i1 %res
745
+ }
746
+
747
+ define i1 @discr_eq_failed_to_simplify (i8 %a , i8 %b ) {
748
+ ; CHECK-LABEL: @discr_eq_failed_to_simplify(
749
+ ; CHECK-NEXT: entry:
750
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i8 [[A:%.*]], -3
751
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i8 [[A]], 1
752
+ ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i8 [[ADD1]], i8 1
753
+ ; CHECK-NEXT: [[ADD2:%.*]] = add i8 [[B:%.*]], -2
754
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i8 [[B]], 1
755
+ ; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i8 [[ADD2]], i8 1
756
+ ; CHECK-NEXT: [[RES:%.*]] = icmp eq i8 [[SEL1]], [[SEL2]]
757
+ ; CHECK-NEXT: ret i1 [[RES]]
758
+ ;
759
+ entry:
760
+ %add1 = add i8 %a , -3
761
+ %cmp1 = icmp ugt i8 %a , 1
762
+ %sel1 = select i1 %cmp1 , i8 %add1 , i8 1
763
+ %add2 = add i8 %b , -2
764
+ %cmp2 = icmp ugt i8 %b , 1
765
+ %sel2 = select i1 %cmp2 , i8 %add2 , i8 1
766
+ %res = icmp eq i8 %sel1 , %sel2
767
+ ret i1 %res
768
+ }
0 commit comments