@@ -629,13 +629,11 @@ define i1 @ashr_uge_sub(i8 %b, i8 %x, i8 %y) {
629
629
ret i1 %r
630
630
}
631
631
632
+ ; (zext i1 a) + (sext i1 b)) s< -1 --> false
633
+
632
634
define i1 @zext_sext_add_icmp_slt_minus1 (i1 %a , i1 %b ) {
633
635
; CHECK-LABEL: @zext_sext_add_icmp_slt_minus1(
634
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
635
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
636
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
637
- ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[ADD]], -1
638
- ; CHECK-NEXT: ret i1 [[R]]
636
+ ; CHECK-NEXT: ret i1 false
639
637
;
640
638
%zext.a = zext i1 %a to i8
641
639
%sext.b = sext i1 %b to i8
@@ -644,13 +642,11 @@ define i1 @zext_sext_add_icmp_slt_minus1(i1 %a, i1 %b) {
644
642
ret i1 %r
645
643
}
646
644
645
+ ; (zext i1 a) + (sext i1 b)) s> 1 --> false
646
+
647
647
define i1 @zext_sext_add_icmp_sgt_1 (i1 %a , i1 %b ) {
648
648
; CHECK-LABEL: @zext_sext_add_icmp_sgt_1(
649
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
650
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
651
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
652
- ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[ADD]], 1
653
- ; CHECK-NEXT: ret i1 [[R]]
649
+ ; CHECK-NEXT: ret i1 false
654
650
;
655
651
%zext.a = zext i1 %a to i8
656
652
%sext.b = sext i1 %b to i8
@@ -659,13 +655,11 @@ define i1 @zext_sext_add_icmp_sgt_1(i1 %a, i1 %b) {
659
655
ret i1 %r
660
656
}
661
657
658
+ ; (zext i1 a) + (sext i1 b)) s> -2 --> true
659
+
662
660
define i1 @zext_sext_add_icmp_sgt_minus2 (i1 %a , i1 %b ) {
663
661
; CHECK-LABEL: @zext_sext_add_icmp_sgt_minus2(
664
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
665
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
666
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
667
- ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[ADD]], -2
668
- ; CHECK-NEXT: ret i1 [[R]]
662
+ ; CHECK-NEXT: ret i1 true
669
663
;
670
664
%zext.a = zext i1 %a to i8
671
665
%sext.b = sext i1 %b to i8
@@ -674,13 +668,11 @@ define i1 @zext_sext_add_icmp_sgt_minus2(i1 %a, i1 %b) {
674
668
ret i1 %r
675
669
}
676
670
671
+ ; (zext i1 a) + (sext i1 b)) s< 2 --> true
672
+
677
673
define i1 @zext_sext_add_icmp_slt_2 (i1 %a , i1 %b ) {
678
674
; CHECK-LABEL: @zext_sext_add_icmp_slt_2(
679
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
680
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
681
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
682
- ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[ADD]], 2
683
- ; CHECK-NEXT: ret i1 [[R]]
675
+ ; CHECK-NEXT: ret i1 true
684
676
;
685
677
%zext.a = zext i1 %a to i8
686
678
%sext.b = sext i1 %b to i8
@@ -689,13 +681,11 @@ define i1 @zext_sext_add_icmp_slt_2(i1 %a, i1 %b) {
689
681
ret i1 %r
690
682
}
691
683
684
+ ; test case with i128
685
+
692
686
define i1 @zext_sext_add_icmp_i128 (i1 %a , i1 %b ) {
693
687
; CHECK-LABEL: @zext_sext_add_icmp_i128(
694
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i128
695
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i128
696
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i128 [[ZEXT_A]], [[SEXT_B]]
697
- ; CHECK-NEXT: [[R:%.*]] = icmp sgt i128 [[ADD]], 9223372036854775808
698
- ; CHECK-NEXT: ret i1 [[R]]
688
+ ; CHECK-NEXT: ret i1 false
699
689
;
700
690
%zext.a = zext i1 %a to i128
701
691
%sext.b = sext i1 %b to i128
@@ -704,12 +694,12 @@ define i1 @zext_sext_add_icmp_i128(i1 %a, i1 %b) {
704
694
ret i1 %r
705
695
}
706
696
697
+ ; (zext i1 a) + (sext i1 b)) == -1 --> ~a & b
698
+
707
699
define i1 @zext_sext_add_icmp_eq_minus1 (i1 %a , i1 %b ) {
708
700
; CHECK-LABEL: @zext_sext_add_icmp_eq_minus1(
709
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
710
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
711
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
712
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[ADD]], -1
701
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[A:%.*]], true
702
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[TMP1]], [[B:%.*]]
713
703
; CHECK-NEXT: ret i1 [[R]]
714
704
;
715
705
%zext.a = zext i1 %a to i8
@@ -719,12 +709,13 @@ define i1 @zext_sext_add_icmp_eq_minus1(i1 %a, i1 %b) {
719
709
ret i1 %r
720
710
}
721
711
712
+
713
+ ; (zext i1 a) + (sext i1 b)) != -1 --> a | ~b
714
+
722
715
define i1 @zext_sext_add_icmp_ne_minus1 (i1 %a , i1 %b ) {
723
716
; CHECK-LABEL: @zext_sext_add_icmp_ne_minus1(
724
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
725
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
726
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
727
- ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[ADD]], -1
717
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[B:%.*]], true
718
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[TMP1]], [[A:%.*]]
728
719
; CHECK-NEXT: ret i1 [[R]]
729
720
;
730
721
%zext.a = zext i1 %a to i8
@@ -734,10 +725,12 @@ define i1 @zext_sext_add_icmp_ne_minus1(i1 %a, i1 %b) {
734
725
ret i1 %r
735
726
}
736
727
728
+ ; (zext i1 a) + (sext i1 b)) s> -1 --> a | ~b
729
+
737
730
define i1 @zext_sext_add_icmp_sgt_minus1 (i1 %a , i1 %b ) {
738
731
; CHECK-LABEL: @zext_sext_add_icmp_sgt_minus1(
739
- ; CHECK-NEXT: [[B_NOT :%.*]] = xor i1 [[B:%.*]], true
740
- ; CHECK-NEXT: [[R:%.*]] = or i1 [[B_NOT ]], [[A:%.*]]
732
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i1 [[B:%.*]], true
733
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[TMP1 ]], [[A:%.*]]
741
734
; CHECK-NEXT: ret i1 [[R]]
742
735
;
743
736
%zext.a = zext i1 %a to i8
@@ -747,12 +740,12 @@ define i1 @zext_sext_add_icmp_sgt_minus1(i1 %a, i1 %b) {
747
740
ret i1 %r
748
741
}
749
742
743
+ ; (zext i1 a) + (sext i1 b)) u< -1 --> a | ~b
744
+
750
745
define i1 @zext_sext_add_icmp_ult_minus1 (i1 %a , i1 %b ) {
751
746
; CHECK-LABEL: @zext_sext_add_icmp_ult_minus1(
752
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
753
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
754
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
755
- ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[ADD]], -1
747
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[B:%.*]], true
748
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[TMP1]], [[A:%.*]]
756
749
; CHECK-NEXT: ret i1 [[R]]
757
750
;
758
751
%zext.a = zext i1 %a to i8
@@ -762,12 +755,12 @@ define i1 @zext_sext_add_icmp_ult_minus1(i1 %a, i1 %b) {
762
755
ret i1 %r
763
756
}
764
757
758
+ ; (zext i1 a) + (sext i1 b)) s> 0 --> a & ~b
759
+
765
760
define i1 @zext_sext_add_icmp_sgt_0 (i1 %a , i1 %b ) {
766
761
; CHECK-LABEL: @zext_sext_add_icmp_sgt_0(
767
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
768
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
769
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
770
- ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[ADD]], 0
762
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[B:%.*]], true
763
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[TMP1]], [[A:%.*]]
771
764
; CHECK-NEXT: ret i1 [[R]]
772
765
;
773
766
%zext.a = zext i1 %a to i8
@@ -777,11 +770,13 @@ define i1 @zext_sext_add_icmp_sgt_0(i1 %a, i1 %b) {
777
770
ret i1 %r
778
771
}
779
772
773
+ ; (zext i1 a) + (sext i1 b)) s< 0 --> ~a & b
774
+
780
775
define i1 @zext_sext_add_icmp_slt_0 (i1 %a , i1 %b ) {
781
776
; CHECK-LABEL: @zext_sext_add_icmp_slt_0(
782
777
; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[A:%.*]], true
783
- ; CHECK-NEXT: [[TMP2 :%.*]] = and i1 [[TMP1]], [[B:%.*]]
784
- ; CHECK-NEXT: ret i1 [[TMP2 ]]
778
+ ; CHECK-NEXT: [[R :%.*]] = and i1 [[TMP1]], [[B:%.*]]
779
+ ; CHECK-NEXT: ret i1 [[R ]]
785
780
;
786
781
%zext.a = zext i1 %a to i8
787
782
%sext.b = sext i1 %b to i8
@@ -790,12 +785,12 @@ define i1 @zext_sext_add_icmp_slt_0(i1 %a, i1 %b) {
790
785
ret i1 %r
791
786
}
792
787
788
+ ; (zext i1 a) + (sext i1 b)) == 1 --> a & ~b
789
+
793
790
define i1 @zext_sext_add_icmp_eq_1 (i1 %a , i1 %b ) {
794
791
; CHECK-LABEL: @zext_sext_add_icmp_eq_1(
795
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
796
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
797
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
798
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[ADD]], 1
792
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[B:%.*]], true
793
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[TMP1]], [[A:%.*]]
799
794
; CHECK-NEXT: ret i1 [[R]]
800
795
;
801
796
%zext.a = zext i1 %a to i8
@@ -805,12 +800,12 @@ define i1 @zext_sext_add_icmp_eq_1(i1 %a, i1 %b) {
805
800
ret i1 %r
806
801
}
807
802
803
+ ; (zext i1 a) + (sext i1 b)) != 1 --> ~a | b
804
+
808
805
define i1 @zext_sext_add_icmp_ne_1 (i1 %a , i1 %b ) {
809
806
; CHECK-LABEL: @zext_sext_add_icmp_ne_1(
810
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
811
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
812
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
813
- ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[ADD]], 1
807
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[A:%.*]], true
808
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[TMP1]], [[B:%.*]]
814
809
; CHECK-NEXT: ret i1 [[R]]
815
810
;
816
811
%zext.a = zext i1 %a to i8
@@ -820,12 +815,12 @@ define i1 @zext_sext_add_icmp_ne_1(i1 %a, i1 %b) {
820
815
ret i1 %r
821
816
}
822
817
818
+ ; (zext i1 a) + (sext i1 b)) s< 1 --> ~a | b
819
+
823
820
define i1 @zext_sext_add_icmp_slt_1 (i1 %a , i1 %b ) {
824
821
; CHECK-LABEL: @zext_sext_add_icmp_slt_1(
825
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
826
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext i1 [[B:%.*]] to i8
827
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[ZEXT_A]], [[SEXT_B]]
828
- ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[ADD]], 1
822
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[A:%.*]], true
823
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[TMP1]], [[B:%.*]]
829
824
; CHECK-NEXT: ret i1 [[R]]
830
825
;
831
826
%zext.a = zext i1 %a to i8
@@ -835,11 +830,13 @@ define i1 @zext_sext_add_icmp_slt_1(i1 %a, i1 %b) {
835
830
ret i1 %r
836
831
}
837
832
833
+ ; (zext i1 a) + (sext i1 b)) u> 1 --> ~a & b
834
+
838
835
define i1 @zext_sext_add_icmp_ugt_1 (i1 %a , i1 %b ) {
839
836
; CHECK-LABEL: @zext_sext_add_icmp_ugt_1(
840
837
; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[A:%.*]], true
841
- ; CHECK-NEXT: [[TMP2 :%.*]] = and i1 [[TMP1]], [[B:%.*]]
842
- ; CHECK-NEXT: ret i1 [[TMP2 ]]
838
+ ; CHECK-NEXT: [[R :%.*]] = and i1 [[TMP1]], [[B:%.*]]
839
+ ; CHECK-NEXT: ret i1 [[R ]]
843
840
;
844
841
%zext.a = zext i1 %a to i8
845
842
%sext.b = sext i1 %b to i8
@@ -850,10 +847,8 @@ define i1 @zext_sext_add_icmp_ugt_1(i1 %a, i1 %b) {
850
847
851
848
define <2 x i1 > @vector_zext_sext_add_icmp_slt_1 (<2 x i1 > %a , <2 x i1 > %b ) {
852
849
; CHECK-LABEL: @vector_zext_sext_add_icmp_slt_1(
853
- ; CHECK-NEXT: [[ZEXT_A:%.*]] = zext <2 x i1> [[A:%.*]] to <2 x i8>
854
- ; CHECK-NEXT: [[SEXT_B:%.*]] = sext <2 x i1> [[B:%.*]] to <2 x i8>
855
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw <2 x i8> [[ZEXT_A]], [[SEXT_B]]
856
- ; CHECK-NEXT: [[R:%.*]] = icmp slt <2 x i8> [[ADD]], <i8 1, i8 1>
850
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i1> [[A:%.*]], <i1 true, i1 true>
851
+ ; CHECK-NEXT: [[R:%.*]] = or <2 x i1> [[TMP1]], [[B:%.*]]
857
852
; CHECK-NEXT: ret <2 x i1> [[R]]
858
853
;
859
854
%zext.a = zext <2 x i1 > %a to <2 x i8 >
@@ -878,6 +873,8 @@ define <2 x i1> @vector_zext_sext_add_icmp_slt_1_poison(<2 x i1> %a, <2 x i1> %b
878
873
ret <2 x i1 > %r
879
874
}
880
875
876
+ ; Negative test, more than one use for icmp LHS
877
+
881
878
define i1 @zext_sext_add_icmp_slt_1_no_oneuse (i1 %a , i1 %b ) {
882
879
; CHECK-LABEL: @zext_sext_add_icmp_slt_1_no_oneuse(
883
880
; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
@@ -895,6 +892,8 @@ define i1 @zext_sext_add_icmp_slt_1_no_oneuse(i1 %a, i1 %b) {
895
892
ret i1 %r
896
893
}
897
894
895
+ ; Negative test, icmp RHS is not a constant
896
+
898
897
define i1 @zext_sext_add_icmp_slt_1_rhs_not_const (i1 %a , i1 %b , i8 %c ) {
899
898
; CHECK-LABEL: @zext_sext_add_icmp_slt_1_rhs_not_const(
900
899
; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i1 [[A:%.*]] to i8
@@ -910,6 +909,8 @@ define i1 @zext_sext_add_icmp_slt_1_rhs_not_const(i1 %a, i1 %b, i8 %c) {
910
909
ret i1 %r
911
910
}
912
911
912
+ ; Negative test, ext source is not i1
913
+
913
914
define i1 @zext_sext_add_icmp_slt_1_type_not_i1 (i2 %a , i1 %b ) {
914
915
; CHECK-LABEL: @zext_sext_add_icmp_slt_1_type_not_i1(
915
916
; CHECK-NEXT: [[ZEXT_A:%.*]] = zext i2 [[A:%.*]] to i8
0 commit comments