@@ -769,3 +769,101 @@ entry:
769
769
%cmp = icmp sle i32 %select , %not.c
770
770
ret i1 %cmp
771
771
}
772
+
773
+ define i32 @test_sext (i32 %a , i32 %b ){
774
+ ; CHECK-LABEL: @test_sext(
775
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0
776
+ ; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[CMP]] to i32
777
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SEXT]], [[B:%.*]]
778
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[ADD]], -1
779
+ ; CHECK-NEXT: ret i32 [[NOT]]
780
+ ;
781
+ %cmp = icmp eq i32 %a , 0
782
+ %sext = sext i1 %cmp to i32
783
+ %add = add i32 %b , %sext
784
+ %not = xor i32 %add , -1
785
+ ret i32 %not
786
+ }
787
+
788
+ define <2 x i32 > @test_sext_vec (<2 x i32 > %a , <2 x i32 > %b ){
789
+ ; CHECK-LABEL: @test_sext_vec(
790
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], zeroinitializer
791
+ ; CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i32>
792
+ ; CHECK-NEXT: [[ADD:%.*]] = add <2 x i32> [[SEXT]], [[B:%.*]]
793
+ ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i32> [[ADD]], <i32 -1, i32 -1>
794
+ ; CHECK-NEXT: ret <2 x i32> [[NOT]]
795
+ ;
796
+ %cmp = icmp eq <2 x i32 > %a , zeroinitializer
797
+ %sext = sext <2 x i1 > %cmp to <2 x i32 >
798
+ %add = add <2 x i32 > %b , %sext
799
+ %not = xor <2 x i32 > %add , <i32 -1 , i32 -1 >
800
+ ret <2 x i32 > %not
801
+ }
802
+
803
+ define i64 @test_zext_nneg (i32 %c1 , i64 %c2 , i64 %c3 ){
804
+ ; CHECK-LABEL: @test_zext_nneg(
805
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[C1:%.*]], -1
806
+ ; CHECK-NEXT: [[CONV:%.*]] = zext nneg i32 [[NOT]] to i64
807
+ ; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[C2:%.*]], -5
808
+ ; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[CONV]], [[C3:%.*]]
809
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[ADD1]], [[ADD2]]
810
+ ; CHECK-NEXT: ret i64 [[SUB]]
811
+ ;
812
+ %not = xor i32 %c1 , -1
813
+ %conv = zext nneg i32 %not to i64
814
+ %add1 = add i64 %c2 , -5
815
+ %add2 = add i64 %conv , %c3
816
+ %sub = sub i64 %add1 , %add2
817
+ ret i64 %sub
818
+ }
819
+
820
+ define i8 @test_trunc (i8 %a ){
821
+ ; CHECK-LABEL: @test_trunc(
822
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[A:%.*]] to i32
823
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[ZEXT]], -1
824
+ ; CHECK-NEXT: [[SHR:%.*]] = ashr i32 [[SUB]], 31
825
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[SHR]] to i8
826
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[CONV]], -1
827
+ ; CHECK-NEXT: ret i8 [[NOT]]
828
+ ;
829
+ %zext = zext i8 %a to i32
830
+ %sub = add nsw i32 %zext , -1
831
+ %shr = ashr i32 %sub , 31
832
+ %conv = trunc i32 %shr to i8
833
+ %not = xor i8 %conv , -1
834
+ ret i8 %not
835
+ }
836
+
837
+ define <2 x i8 > @test_trunc_vec (<2 x i8 > %a ){
838
+ ; CHECK-LABEL: @test_trunc_vec(
839
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i8> [[A:%.*]] to <2 x i32>
840
+ ; CHECK-NEXT: [[SUB:%.*]] = add nsw <2 x i32> [[ZEXT]], <i32 -1, i32 -1>
841
+ ; CHECK-NEXT: [[SHR:%.*]] = ashr <2 x i32> [[SUB]], <i32 31, i32 31>
842
+ ; CHECK-NEXT: [[CONV:%.*]] = trunc <2 x i32> [[SHR]] to <2 x i8>
843
+ ; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i8> [[CONV]], <i8 -1, i8 -1>
844
+ ; CHECK-NEXT: ret <2 x i8> [[NOT]]
845
+ ;
846
+ %zext = zext <2 x i8 > %a to <2 x i32 >
847
+ %sub = add nsw <2 x i32 > %zext , <i32 -1 , i32 -1 >
848
+ %shr = ashr <2 x i32 > %sub , <i32 31 , i32 31 >
849
+ %conv = trunc <2 x i32 > %shr to <2 x i8 >
850
+ %not = xor <2 x i8 > %conv , <i8 -1 , i8 -1 >
851
+ ret <2 x i8 > %not
852
+ }
853
+
854
+ ; Negative tests
855
+
856
+ define i32 @test_zext (i32 %a , i32 %b ){
857
+ ; CHECK-LABEL: @test_zext(
858
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0
859
+ ; CHECK-NEXT: [[SEXT:%.*]] = zext i1 [[CMP]] to i32
860
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SEXT]], [[B:%.*]]
861
+ ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[ADD]], -1
862
+ ; CHECK-NEXT: ret i32 [[NOT]]
863
+ ;
864
+ %cmp = icmp eq i32 %a , 0
865
+ %sext = zext i1 %cmp to i32
866
+ %add = add i32 %b , %sext
867
+ %not = xor i32 %add , -1
868
+ ret i32 %not
869
+ }
0 commit comments