@@ -809,3 +809,97 @@ define i8 @select_bittest_to_xor(i8 %x) {
809809 %masksel = select i1 %cmp , i8 %or , i8 %and
810810 ret i8 %masksel
811811}
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