@@ -606,3 +606,190 @@ define i1 @fold_ne_rhs_fail_shift_not_1s(i8 %x, i8 %yy) {
606
606
%r = icmp ne i8 %and , 0
607
607
ret i1 %r
608
608
}
609
+
610
+ define i1 @test_shl_sub_bw_minus_1_slt_0 (i32 %a , i32 %b ) {
611
+ ; CHECK-LABEL: @test_shl_sub_bw_minus_1_slt_0(
612
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[B:%.*]]
613
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
614
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[SHL]], 0
615
+ ; CHECK-NEXT: ret i1 [[CMP]]
616
+ ;
617
+ %sub = sub i32 31 , %b
618
+ %shl = shl i32 %a , %sub
619
+ %cmp = icmp slt i32 %shl , 0
620
+ ret i1 %cmp
621
+ }
622
+
623
+ define i1 @test_const_shl_sub_bw_minus_1_slt_0 (i32 %b ) {
624
+ ; CHECK-LABEL: @test_const_shl_sub_bw_minus_1_slt_0(
625
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[B:%.*]]
626
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 42, [[SUB]]
627
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[SHL]], 0
628
+ ; CHECK-NEXT: ret i1 [[CMP]]
629
+ ;
630
+ %sub = sub i32 31 , %b
631
+ %shl = shl i32 42 , %sub
632
+ %cmp = icmp slt i32 %shl , 0
633
+ ret i1 %cmp
634
+ }
635
+
636
+ define i1 @test_not_shl_sub_bw_minus_1_slt_0 (i32 %a , i32 %b ) {
637
+ ; CHECK-LABEL: @test_not_shl_sub_bw_minus_1_slt_0(
638
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[B:%.*]]
639
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
640
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[SHL]], -1
641
+ ; CHECK-NEXT: ret i1 [[CMP]]
642
+ ;
643
+ %sub = sub i32 31 , %b
644
+ %shl = shl i32 %a , %sub
645
+ %cmp = icmp sge i32 %shl , 0
646
+ ret i1 %cmp
647
+ }
648
+
649
+ define i1 @test_shl_nuw_sub_bw_minus_1_slt_0 (i32 %a , i32 %b ) {
650
+ ; CHECK-LABEL: @test_shl_nuw_sub_bw_minus_1_slt_0(
651
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[B:%.*]]
652
+ ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 [[A:%.*]], [[SUB]]
653
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[SHL]], 0
654
+ ; CHECK-NEXT: ret i1 [[CMP]]
655
+ ;
656
+ %sub = sub i32 31 , %b
657
+ %shl = shl nuw i32 %a , %sub
658
+ %cmp = icmp slt i32 %shl , 0
659
+ ret i1 %cmp
660
+ }
661
+
662
+ define i1 @test_not_const_shl_sub_bw_minus_1_slt_0 (i32 %b ) {
663
+ ; CHECK-LABEL: @test_not_const_shl_sub_bw_minus_1_slt_0(
664
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[B:%.*]]
665
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 42, [[SUB]]
666
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[SHL]], -1
667
+ ; CHECK-NEXT: ret i1 [[CMP]]
668
+ ;
669
+ %sub = sub i32 31 , %b
670
+ %shl = shl i32 42 , %sub
671
+ %cmp = icmp sge i32 %shl , 0
672
+ ret i1 %cmp
673
+ }
674
+
675
+ define <8 x i1 > @test_shl_sub_bw_minus_1_slt_0_v8i8 (<8 x i8 > %a , <8 x i8 > %b ) {
676
+ ; CHECK-LABEL: @test_shl_sub_bw_minus_1_slt_0_v8i8(
677
+ ; CHECK-NEXT: [[SUB:%.*]] = sub <8 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>, [[B:%.*]]
678
+ ; CHECK-NEXT: [[SHL:%.*]] = shl <8 x i8> [[A:%.*]], [[SUB]]
679
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <8 x i8> [[SHL]], zeroinitializer
680
+ ; CHECK-NEXT: ret <8 x i1> [[CMP]]
681
+ ;
682
+ %sub = sub <8 x i8 > <i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 >, %b
683
+ %shl = shl <8 x i8 > %a , %sub
684
+ %cmp = icmp slt <8 x i8 > %shl , zeroinitializer
685
+ ret <8 x i1 > %cmp
686
+ }
687
+
688
+ define <8 x i1 > @test_const_shl_sub_bw_minus_1_slt_0_v8i8_splat (<8 x i8 > %b ) {
689
+ ; CHECK-LABEL: @test_const_shl_sub_bw_minus_1_slt_0_v8i8_splat(
690
+ ; CHECK-NEXT: [[SUB:%.*]] = sub <8 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>, [[B:%.*]]
691
+ ; CHECK-NEXT: [[SHL:%.*]] = shl <8 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>, [[SUB]]
692
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <8 x i8> [[SHL]], zeroinitializer
693
+ ; CHECK-NEXT: ret <8 x i1> [[CMP]]
694
+ ;
695
+ %sub = sub <8 x i8 > <i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 >, %b
696
+ %shl = shl <8 x i8 > <i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 >, %sub
697
+ %cmp = icmp slt <8 x i8 > %shl , zeroinitializer
698
+ ret <8 x i1 > %cmp
699
+ }
700
+
701
+ define <8 x i1 > @test_const_shl_sub_bw_minus_1_slt_0_v8i8_splat_poison_1 (<8 x i8 > %b ) {
702
+ ; CHECK-LABEL: @test_const_shl_sub_bw_minus_1_slt_0_v8i8_splat_poison_1(
703
+ ; CHECK-NEXT: [[SUB:%.*]] = sub <8 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 poison>, [[B:%.*]]
704
+ ; CHECK-NEXT: [[SHL:%.*]] = shl <8 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>, [[SUB]]
705
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <8 x i8> [[SHL]], zeroinitializer
706
+ ; CHECK-NEXT: ret <8 x i1> [[CMP]]
707
+ ;
708
+ %sub = sub <8 x i8 > <i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 poison>, %b
709
+ %shl = shl <8 x i8 > <i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 >, %sub
710
+ %cmp = icmp slt <8 x i8 > %shl , zeroinitializer
711
+ ret <8 x i1 > %cmp
712
+ }
713
+
714
+ define <8 x i1 > @test_const_shl_sub_bw_minus_1_slt_0_v8i8_splat_poison_2 (<8 x i8 > %b ) {
715
+ ; CHECK-LABEL: @test_const_shl_sub_bw_minus_1_slt_0_v8i8_splat_poison_2(
716
+ ; CHECK-NEXT: [[SUB:%.*]] = sub <8 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>, [[B:%.*]]
717
+ ; CHECK-NEXT: [[SHL:%.*]] = shl <8 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 poison>, [[SUB]]
718
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <8 x i8> [[SHL]], zeroinitializer
719
+ ; CHECK-NEXT: ret <8 x i1> [[CMP]]
720
+ ;
721
+ %sub = sub <8 x i8 > <i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 >, %b
722
+ %shl = shl <8 x i8 > <i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 42 , i8 poison>, %sub
723
+ %cmp = icmp slt <8 x i8 > %shl , zeroinitializer
724
+ ret <8 x i1 > %cmp
725
+ }
726
+
727
+ define <8 x i1 > @test_const_shl_sub_bw_minus_1_slt_0_v8i8_nonsplat (<8 x i8 > %b ) {
728
+ ; CHECK-LABEL: @test_const_shl_sub_bw_minus_1_slt_0_v8i8_nonsplat(
729
+ ; CHECK-NEXT: [[SUB:%.*]] = sub <8 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>, [[B:%.*]]
730
+ ; CHECK-NEXT: [[SHL:%.*]] = shl <8 x i8> <i8 42, i8 43, i8 44, i8 45, i8 46, i8 47, i8 48, i8 49>, [[SUB]]
731
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <8 x i8> [[SHL]], zeroinitializer
732
+ ; CHECK-NEXT: ret <8 x i1> [[CMP]]
733
+ ;
734
+ %sub = sub <8 x i8 > <i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 , i8 7 >, %b
735
+ %shl = shl <8 x i8 > <i8 42 , i8 43 , i8 44 , i8 45 , i8 46 , i8 47 , i8 48 , i8 49 >, %sub
736
+ %cmp = icmp slt <8 x i8 > %shl , zeroinitializer
737
+ ret <8 x i1 > %cmp
738
+ }
739
+
740
+ define i1 @test_shl_sub_non_bw_minus_1_slt_0_negative (i32 %a , i32 %b ) {
741
+ ; CHECK-LABEL: @test_shl_sub_non_bw_minus_1_slt_0_negative(
742
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 32, [[B:%.*]]
743
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
744
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[SHL]], 0
745
+ ; CHECK-NEXT: ret i1 [[CMP]]
746
+ ;
747
+ %sub = sub i32 32 , %b
748
+ %shl = shl i32 %a , %sub
749
+ %cmp = icmp slt i32 %shl , 0
750
+ ret i1 %cmp
751
+ }
752
+
753
+ define i1 @test_shl_sub_bw_minus_1_slt_0_i1_negative (i1 %a , i1 %b ) {
754
+ ; CHECK-LABEL: @test_shl_sub_bw_minus_1_slt_0_i1_negative(
755
+ ; CHECK-NEXT: ret i1 [[A:%.*]]
756
+ ;
757
+ %sub = sub i1 0 , %b
758
+ %shl = shl i1 %a , %sub
759
+ %cmp = icmp slt i1 %shl , 0
760
+ ret i1 %cmp
761
+ }
762
+
763
+ define i1 @test_shl_sub_bw_minus_1_slt_0_multi_use_sub_negative (i32 %a , i32 %b ) {
764
+ ; CHECK-LABEL: @test_shl_sub_bw_minus_1_slt_0_multi_use_sub_negative(
765
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[B:%.*]]
766
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
767
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[SHL]], 0
768
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[SUB]], [[B]]
769
+ ; CHECK-NEXT: [[RET:%.*]] = or i1 [[CMP1]], [[CMP2]]
770
+ ; CHECK-NEXT: ret i1 [[RET]]
771
+ ;
772
+ %sub = sub i32 31 , %b
773
+ %shl = shl i32 %a , %sub
774
+ %cmp1 = icmp slt i32 %shl , 0
775
+ %cmp2 = icmp slt i32 %b , %sub
776
+ %ret = or i1 %cmp1 , %cmp2
777
+ ret i1 %ret
778
+ }
779
+
780
+ define i1 @test_shl_sub_bw_minus_1_slt_0_multi_use_shl_negative (i32 %a , i32 %b ) {
781
+ ; CHECK-LABEL: @test_shl_sub_bw_minus_1_slt_0_multi_use_shl_negative(
782
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i32 31, [[B:%.*]]
783
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i32 [[A:%.*]], [[SUB]]
784
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[SHL]], 0
785
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[SHL]], [[B]]
786
+ ; CHECK-NEXT: [[RET:%.*]] = and i1 [[CMP1]], [[CMP2]]
787
+ ; CHECK-NEXT: ret i1 [[RET]]
788
+ ;
789
+ %sub = sub i32 31 , %b
790
+ %shl = shl i32 %a , %sub
791
+ %cmp1 = icmp slt i32 %shl , 0
792
+ %cmp2 = icmp eq i32 %b , %shl
793
+ %ret = and i1 %cmp1 , %cmp2
794
+ ret i1 %ret
795
+ }
0 commit comments