@@ -470,6 +470,24 @@ define i1 @src_is_notmask_x_xor_neg_x(i8 %x_in, i8 %y, i1 %cond) {
470
470
ret i1 %r
471
471
}
472
472
473
+ define i1 @src_is_notmask_x_xor_neg_x_inv (i8 %x_in , i8 %y , i1 %cond ) {
474
+ ; CHECK-LABEL: @src_is_notmask_x_xor_neg_x_inv(
475
+ ; CHECK-NEXT: [[X:%.*]] = xor i8 [[X_IN:%.*]], 123
476
+ ; CHECK-NEXT: [[NEG_Y:%.*]] = add i8 [[Y:%.*]], -1
477
+ ; CHECK-NEXT: [[NOTMASK0:%.*]] = xor i8 [[NEG_Y]], [[Y]]
478
+ ; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[COND:%.*]], i8 [[NOTMASK0]], i8 7
479
+ ; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[X]], [[TMP3]]
480
+ ; CHECK-NEXT: ret i1 [[R]]
481
+ ;
482
+ %x = xor i8 %x_in , 123
483
+ %neg_y = sub i8 0 , %y
484
+ %nmask0 = xor i8 %y , %neg_y
485
+ %notmask = select i1 %cond , i8 %nmask0 , i8 -8
486
+ %and = and i8 %notmask , %x
487
+ %r = icmp eq i8 %and , 0
488
+ ret i1 %r
489
+ }
490
+
473
491
define i1 @src_is_notmask_shl_fail_multiuse_invert (i8 %x_in , i8 %y , i1 %cond ) {
474
492
; CHECK-LABEL: @src_is_notmask_shl_fail_multiuse_invert(
475
493
; CHECK-NEXT: [[X:%.*]] = xor i8 [[X_IN:%.*]], 122
@@ -655,3 +673,247 @@ define i1 @src_is_mask_const_sge(i8 %x_in) {
655
673
%r = icmp sge i8 %and , %x
656
674
ret i1 %r
657
675
}
676
+
677
+ define i1 @src_x_and_mask_slt (i8 %x , i8 %y , i1 %cond ) {
678
+ ; CHECK-LABEL: @src_x_and_mask_slt(
679
+ ; CHECK-NEXT: [[MASK0:%.*]] = lshr i8 -1, [[Y:%.*]]
680
+ ; CHECK-NEXT: [[MASK:%.*]] = select i1 [[COND:%.*]], i8 [[MASK0]], i8 0
681
+ ; CHECK-NEXT: [[MASK_POS:%.*]] = icmp sgt i8 [[MASK]], -1
682
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[MASK_POS]])
683
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[MASK]], [[X:%.*]]
684
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[AND]], [[X]]
685
+ ; CHECK-NEXT: ret i1 [[R]]
686
+ ;
687
+ %mask0 = lshr i8 -1 , %y
688
+ %mask = select i1 %cond , i8 %mask0 , i8 0
689
+ %mask_pos = icmp sge i8 %mask , 0
690
+ call void @llvm.assume (i1 %mask_pos )
691
+ %and = and i8 %x , %mask
692
+ %r = icmp slt i8 %and , %x
693
+ ret i1 %r
694
+ }
695
+
696
+ define i1 @src_x_and_mask_sge (i8 %x , i8 %y , i1 %cond ) {
697
+ ; CHECK-LABEL: @src_x_and_mask_sge(
698
+ ; CHECK-NEXT: [[MASK0:%.*]] = lshr i8 -1, [[Y:%.*]]
699
+ ; CHECK-NEXT: [[MASK:%.*]] = select i1 [[COND:%.*]], i8 [[MASK0]], i8 0
700
+ ; CHECK-NEXT: [[MASK_POS:%.*]] = icmp sgt i8 [[MASK]], -1
701
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[MASK_POS]])
702
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[MASK]], [[X:%.*]]
703
+ ; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[AND]], [[X]]
704
+ ; CHECK-NEXT: ret i1 [[R]]
705
+ ;
706
+ %mask0 = lshr i8 -1 , %y
707
+ %mask = select i1 %cond , i8 %mask0 , i8 0
708
+ %mask_pos = icmp sge i8 %mask , 0
709
+ call void @llvm.assume (i1 %mask_pos )
710
+ %and = and i8 %x , %mask
711
+ %r = icmp sge i8 %and , %x
712
+ ret i1 %r
713
+ }
714
+
715
+ define i1 @src_x_and_mask_slt_fail_maybe_neg (i8 %x , i8 %y , i1 %cond ) {
716
+ ; CHECK-LABEL: @src_x_and_mask_slt_fail_maybe_neg(
717
+ ; CHECK-NEXT: [[MASK0:%.*]] = lshr i8 -1, [[Y:%.*]]
718
+ ; CHECK-NEXT: [[MASK:%.*]] = select i1 [[COND:%.*]], i8 [[MASK0]], i8 0
719
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[MASK]], [[X:%.*]]
720
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[AND]], [[X]]
721
+ ; CHECK-NEXT: ret i1 [[R]]
722
+ ;
723
+ %mask0 = lshr i8 -1 , %y
724
+ %mask = select i1 %cond , i8 %mask0 , i8 0
725
+ %and = and i8 %x , %mask
726
+ %r = icmp slt i8 %and , %x
727
+ ret i1 %r
728
+ }
729
+
730
+ define i1 @src_x_and_mask_sge_fail_maybe_neg (i8 %x , i8 %y , i1 %cond ) {
731
+ ; CHECK-LABEL: @src_x_and_mask_sge_fail_maybe_neg(
732
+ ; CHECK-NEXT: [[MASK0:%.*]] = lshr i8 -1, [[Y:%.*]]
733
+ ; CHECK-NEXT: [[MASK:%.*]] = select i1 [[COND:%.*]], i8 [[MASK0]], i8 0
734
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[MASK]], [[X:%.*]]
735
+ ; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[AND]], [[X]]
736
+ ; CHECK-NEXT: ret i1 [[R]]
737
+ ;
738
+ %mask0 = lshr i8 -1 , %y
739
+ %mask = select i1 %cond , i8 %mask0 , i8 0
740
+ %and = and i8 %x , %mask
741
+ %r = icmp sge i8 %and , %x
742
+ ret i1 %r
743
+ }
744
+
745
+ define i1 @src_x_and_nmask_eq (i8 %x , i8 %y , i1 %cond ) {
746
+ ; CHECK-LABEL: @src_x_and_nmask_eq(
747
+ ; CHECK-NEXT: [[NOT_MASK0:%.*]] = shl nsw i8 -1, [[Y:%.*]]
748
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = select i1 [[COND:%.*]], i8 [[NOT_MASK0]], i8 0
749
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
750
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[NOT_MASK]], [[AND]]
751
+ ; CHECK-NEXT: ret i1 [[R]]
752
+ ;
753
+ %not_mask0 = shl i8 -1 , %y
754
+ %not_mask = select i1 %cond , i8 %not_mask0 , i8 0
755
+ %and = and i8 %x , %not_mask
756
+ %r = icmp eq i8 %not_mask , %and
757
+ ret i1 %r
758
+ }
759
+
760
+ define i1 @src_x_and_nmask_ne (i8 %x , i8 %y , i1 %cond ) {
761
+ ; CHECK-LABEL: @src_x_and_nmask_ne(
762
+ ; CHECK-NEXT: [[NOT_MASK0:%.*]] = shl nsw i8 -1, [[Y:%.*]]
763
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = select i1 [[COND:%.*]], i8 [[NOT_MASK0]], i8 0
764
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
765
+ ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[AND]], [[NOT_MASK]]
766
+ ; CHECK-NEXT: ret i1 [[R]]
767
+ ;
768
+ %not_mask0 = shl i8 -1 , %y
769
+ %not_mask = select i1 %cond , i8 %not_mask0 , i8 0
770
+ %and = and i8 %x , %not_mask
771
+ %r = icmp ne i8 %and , %not_mask
772
+ ret i1 %r
773
+ }
774
+
775
+ define i1 @src_x_and_nmask_ult (i8 %x , i8 %y , i1 %cond ) {
776
+ ; CHECK-LABEL: @src_x_and_nmask_ult(
777
+ ; CHECK-NEXT: [[NOT_MASK0:%.*]] = shl nsw i8 -1, [[Y:%.*]]
778
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = select i1 [[COND:%.*]], i8 [[NOT_MASK0]], i8 0
779
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
780
+ ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[AND]], [[NOT_MASK]]
781
+ ; CHECK-NEXT: ret i1 [[R]]
782
+ ;
783
+ %not_mask0 = shl i8 -1 , %y
784
+ %not_mask = select i1 %cond , i8 %not_mask0 , i8 0
785
+ %and = and i8 %x , %not_mask
786
+ %r = icmp ult i8 %and , %not_mask
787
+ ret i1 %r
788
+ }
789
+
790
+ define i1 @src_x_and_nmask_uge (i8 %x , i8 %y , i1 %cond ) {
791
+ ; CHECK-LABEL: @src_x_and_nmask_uge(
792
+ ; CHECK-NEXT: [[NOT_MASK0:%.*]] = shl nsw i8 -1, [[Y:%.*]]
793
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = select i1 [[COND:%.*]], i8 [[NOT_MASK0]], i8 0
794
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
795
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], [[NOT_MASK]]
796
+ ; CHECK-NEXT: ret i1 [[R]]
797
+ ;
798
+ %not_mask0 = shl i8 -1 , %y
799
+ %not_mask = select i1 %cond , i8 %not_mask0 , i8 0
800
+ %and = and i8 %x , %not_mask
801
+ %r = icmp uge i8 %and , %not_mask
802
+ ret i1 %r
803
+ }
804
+
805
+ define i1 @src_x_and_nmask_slt (i8 %x , i8 %y ) {
806
+ ; CHECK-LABEL: @src_x_and_nmask_slt(
807
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = shl nsw i8 -1, [[Y:%.*]]
808
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
809
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[AND]], [[NOT_MASK]]
810
+ ; CHECK-NEXT: ret i1 [[R]]
811
+ ;
812
+ %not_mask = shl i8 -1 , %y
813
+ %and = and i8 %x , %not_mask
814
+ %r = icmp slt i8 %and , %not_mask
815
+ ret i1 %r
816
+ }
817
+
818
+ define i1 @src_x_and_nmask_sge (i8 %x , i8 %y ) {
819
+ ; CHECK-LABEL: @src_x_and_nmask_sge(
820
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = shl nsw i8 -1, [[Y:%.*]]
821
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
822
+ ; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[AND]], [[NOT_MASK]]
823
+ ; CHECK-NEXT: ret i1 [[R]]
824
+ ;
825
+ %not_mask = shl i8 -1 , %y
826
+ %and = and i8 %x , %not_mask
827
+ %r = icmp sge i8 %and , %not_mask
828
+ ret i1 %r
829
+ }
830
+
831
+ define i1 @src_x_and_nmask_slt_fail_maybe_z (i8 %x , i8 %y , i1 %cond ) {
832
+ ; CHECK-LABEL: @src_x_and_nmask_slt_fail_maybe_z(
833
+ ; CHECK-NEXT: [[NOT_MASK0:%.*]] = shl nsw i8 -1, [[Y:%.*]]
834
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = select i1 [[COND:%.*]], i8 [[NOT_MASK0]], i8 0
835
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
836
+ ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[AND]], [[NOT_MASK]]
837
+ ; CHECK-NEXT: ret i1 [[R]]
838
+ ;
839
+ %not_mask0 = shl i8 -1 , %y
840
+ %not_mask = select i1 %cond , i8 %not_mask0 , i8 0
841
+ %and = and i8 %x , %not_mask
842
+ %r = icmp slt i8 %and , %not_mask
843
+ ret i1 %r
844
+ }
845
+
846
+ define i1 @src_x_and_nmask_sge_fail_maybe_z (i8 %x , i8 %y , i1 %cond ) {
847
+ ; CHECK-LABEL: @src_x_and_nmask_sge_fail_maybe_z(
848
+ ; CHECK-NEXT: [[NOT_MASK0:%.*]] = shl nsw i8 -1, [[Y:%.*]]
849
+ ; CHECK-NEXT: [[NOT_MASK:%.*]] = select i1 [[COND:%.*]], i8 [[NOT_MASK0]], i8 0
850
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[NOT_MASK]], [[X:%.*]]
851
+ ; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[AND]], [[NOT_MASK]]
852
+ ; CHECK-NEXT: ret i1 [[R]]
853
+ ;
854
+ %not_mask0 = shl i8 -1 , %y
855
+ %not_mask = select i1 %cond , i8 %not_mask0 , i8 0
856
+ %and = and i8 %x , %not_mask
857
+ %r = icmp sge i8 %and , %not_mask
858
+ ret i1 %r
859
+ }
860
+
861
+ define i1 @src_x_or_mask_eq (i8 %x , i8 %y , i8 %z , i1 %c2 , i1 %cond ) {
862
+ ; CHECK-LABEL: @src_x_or_mask_eq(
863
+ ; CHECK-NEXT: [[MASK0:%.*]] = lshr i8 -1, [[Y:%.*]]
864
+ ; CHECK-NEXT: [[MASK:%.*]] = select i1 [[COND:%.*]], i8 [[MASK0]], i8 0
865
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[X:%.*]], -124
866
+ ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C2:%.*]], i8 [[TMP1]], i8 -46
867
+ ; CHECK-NEXT: [[TMP3:%.*]] = call i8 @llvm.umax.i8(i8 [[Z:%.*]], i8 [[TMP2]])
868
+ ; CHECK-NEXT: [[NX_CCC:%.*]] = sub i8 11, [[TMP3]]
869
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[NX_CCC]], [[MASK]]
870
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[OR]], -1
871
+ ; CHECK-NEXT: ret i1 [[R]]
872
+ ;
873
+ %mask0 = lshr i8 -1 , %y
874
+ %mask = select i1 %cond , i8 %mask0 , i8 0
875
+ %nx = xor i8 %x , 123
876
+ %nx_c = select i1 %c2 , i8 %nx , i8 45
877
+ %nz = xor i8 %z , -1
878
+ %nx_cc = call i8 @llvm.umin.i8 (i8 %nz , i8 %nx_c )
879
+ %nx_ccc = add i8 %nx_cc , 12
880
+ %or = or i8 %nx_ccc , %mask
881
+ %r = icmp eq i8 %or , -1
882
+ ret i1 %r
883
+ }
884
+
885
+ define i1 @src_x_or_mask_ne (i8 %x , i8 %y , i1 %cond ) {
886
+ ; CHECK-LABEL: @src_x_or_mask_ne(
887
+ ; CHECK-NEXT: [[MASK0:%.*]] = lshr i8 -1, [[Y:%.*]]
888
+ ; CHECK-NEXT: [[MASK:%.*]] = select i1 [[COND:%.*]], i8 [[MASK0]], i8 0
889
+ ; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
890
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[MASK]], [[NX]]
891
+ ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[OR]], -1
892
+ ; CHECK-NEXT: ret i1 [[R]]
893
+ ;
894
+ %mask0 = lshr i8 -1 , %y
895
+ %mask = select i1 %cond , i8 %mask0 , i8 0
896
+ %nx = xor i8 %x , -1
897
+ %or = or i8 %mask , %nx
898
+ %r = icmp ne i8 %or , -1
899
+ ret i1 %r
900
+ }
901
+
902
+ define i1 @src_x_or_mask_ne_fail_multiuse (i8 %x , i8 %y , i1 %cond ) {
903
+ ; CHECK-LABEL: @src_x_or_mask_ne_fail_multiuse(
904
+ ; CHECK-NEXT: [[MASK0:%.*]] = lshr i8 -1, [[Y:%.*]]
905
+ ; CHECK-NEXT: [[MASK:%.*]] = select i1 [[COND:%.*]], i8 [[MASK0]], i8 0
906
+ ; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -1
907
+ ; CHECK-NEXT: [[OR:%.*]] = or i8 [[MASK]], [[NX]]
908
+ ; CHECK-NEXT: call void @use.i8(i8 [[OR]])
909
+ ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[OR]], -1
910
+ ; CHECK-NEXT: ret i1 [[R]]
911
+ ;
912
+ %mask0 = lshr i8 -1 , %y
913
+ %mask = select i1 %cond , i8 %mask0 , i8 0
914
+ %nx = xor i8 %x , -1
915
+ %or = or i8 %mask , %nx
916
+ call void @use.i8 (i8 %or )
917
+ %r = icmp ne i8 %or , -1
918
+ ret i1 %r
919
+ }
0 commit comments