@@ -809,3 +809,97 @@ define i8 @select_bittest_to_xor(i8 %x) {
809
809
%masksel = select i1 %cmp , i8 %or , i8 %and
810
810
ret i8 %masksel
811
811
}
812
+
813
+ define i8 @select_trunc_bittest_to_sub (i8 %x ) {
814
+ ; CHECK-LABEL: @select_trunc_bittest_to_sub(
815
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i1
816
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 3, i8 4
817
+ ; CHECK-NEXT: ret i8 [[RET]]
818
+ ;
819
+ %trunc = trunc i8 %x to i1
820
+ %ret = select i1 %trunc , i8 3 , i8 4
821
+ ret i8 %ret
822
+ }
823
+
824
+ define i8 @select_trunc_nuw_bittest_to_sub (i8 %x ) {
825
+ ; CHECK-LABEL: @select_trunc_nuw_bittest_to_sub(
826
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[X:%.*]] to i1
827
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 3, i8 4
828
+ ; CHECK-NEXT: ret i8 [[RET]]
829
+ ;
830
+ %trunc = trunc nuw i8 %x to i1
831
+ %ret = select i1 %trunc , i8 3 , i8 4
832
+ ret i8 %ret
833
+ }
834
+
835
+ define i8 @select_trunc_nsw_bittest_to_sub (i8 %x ) {
836
+ ; CHECK-LABEL: @select_trunc_nsw_bittest_to_sub(
837
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nsw i8 [[X:%.*]] to i1
838
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 3, i8 4
839
+ ; CHECK-NEXT: ret i8 [[RET]]
840
+ ;
841
+ %trunc = trunc nsw i8 %x to i1
842
+ %ret = select i1 %trunc , i8 3 , i8 4
843
+ ret i8 %ret
844
+ }
845
+
846
+ define i8 @select_trunc_nuw_bittest_to_sub_extra_use (i8 %x ) {
847
+ ; CHECK-LABEL: @select_trunc_nuw_bittest_to_sub_extra_use(
848
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[X:%.*]] to i1
849
+ ; CHECK-NEXT: call void @use1(i1 [[TRUNC]])
850
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 3, i8 4
851
+ ; CHECK-NEXT: ret i8 [[RET]]
852
+ ;
853
+ %trunc = trunc nuw i8 %x to i1
854
+ call void @use1 (i1 %trunc )
855
+ %ret = select i1 %trunc , i8 3 , i8 4
856
+ ret i8 %ret
857
+ }
858
+
859
+ define i8 @neg_select_trunc_bittest_to_sub_extra_use (i8 %x ) {
860
+ ; CHECK-LABEL: @neg_select_trunc_bittest_to_sub_extra_use(
861
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i1
862
+ ; CHECK-NEXT: call void @use1(i1 [[TRUNC]])
863
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 3, i8 4
864
+ ; CHECK-NEXT: ret i8 [[RET]]
865
+ ;
866
+ %trunc = trunc i8 %x to i1
867
+ call void @use1 (i1 %trunc )
868
+ %ret = select i1 %trunc , i8 3 , i8 4
869
+ ret i8 %ret
870
+ }
871
+
872
+ define i8 @select_trunc_nuw_bittest_to_shl_not (i8 %x ) {
873
+ ; CHECK-LABEL: @select_trunc_nuw_bittest_to_shl_not(
874
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[X:%.*]] to i1
875
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 0, i8 4
876
+ ; CHECK-NEXT: ret i8 [[RET]]
877
+ ;
878
+ %trunc = trunc nuw i8 %x to i1
879
+ %ret = select i1 %trunc , i8 0 , i8 4
880
+ ret i8 %ret
881
+ }
882
+
883
+ define i8 @select_trunc_bittest_to_shl (i8 %x ) {
884
+ ; CHECK-LABEL: @select_trunc_bittest_to_shl(
885
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i1
886
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 4, i8 0
887
+ ; CHECK-NEXT: ret i8 [[RET]]
888
+ ;
889
+ %trunc = trunc i8 %x to i1
890
+ %ret = select i1 %trunc , i8 4 , i8 0
891
+ ret i8 %ret
892
+ }
893
+
894
+ define i8 @neg_select_trunc_bittest_to_shl_extra_use (i8 %x ) {
895
+ ; CHECK-LABEL: @neg_select_trunc_bittest_to_shl_extra_use(
896
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i1
897
+ ; CHECK-NEXT: call void @use1(i1 [[TRUNC]])
898
+ ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 4, i8 0
899
+ ; CHECK-NEXT: ret i8 [[RET]]
900
+ ;
901
+ %trunc = trunc i8 %x to i1
902
+ call void @use1 (i1 %trunc )
903
+ %ret = select i1 %trunc , i8 4 , i8 0
904
+ ret i8 %ret
905
+ }
0 commit comments