@@ -875,8 +875,8 @@ define i32 @ashr_shift_mul(i32 %x) {
875875
876876define i32 @ashr_shift_mul_nuw (i32 %x ) {
877877; CHECK-LABEL: @ashr_shift_mul_nuw(
878- ; CHECK-NEXT: [[A :%.*]] = ashr exact i32 [[X:%.*]], 3
879- ; CHECK-NEXT: [[RES:%.*]] = mul nuw i32 [[A ]], 9
878+ ; CHECK-NEXT: [[TMP1 :%.*]] = lshr exact i32 [[X:%.*]], 3
879+ ; CHECK-NEXT: [[RES:%.*]] = add nuw i32 [[TMP1 ]], [[X]]
880880; CHECK-NEXT: ret i32 [[RES]]
881881;
882882 %a = ashr exact i32 %x , 3
@@ -887,7 +887,7 @@ define i32 @ashr_shift_mul_nuw(i32 %x) {
887887define i32 @ashr_shift_mul_nsw (i32 %x ) {
888888; CHECK-LABEL: @ashr_shift_mul_nsw(
889889; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
890- ; CHECK-NEXT: [[RES:%.*]] = mul nsw i32 [[A]], 9
890+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[A]], [[X]]
891891; CHECK-NEXT: ret i32 [[RES]]
892892;
893893 %a = ashr exact i32 %x , 3
@@ -898,7 +898,7 @@ define i32 @ashr_shift_mul_nsw(i32 %x) {
898898define i32 @lshr_shift_mul_nuw (i32 %x ) {
899899; CHECK-LABEL: @lshr_shift_mul_nuw(
900900; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
901- ; CHECK-NEXT: [[RES:%.*]] = mul nuw i32 [[A]], 9
901+ ; CHECK-NEXT: [[RES:%.*]] = add nuw i32 [[A]], [[X]]
902902; CHECK-NEXT: ret i32 [[RES]]
903903;
904904 %a = lshr exact i32 %x , 3
@@ -920,7 +920,7 @@ define i32 @lshr_shift_mul(i32 %x) {
920920define i32 @lshr_shift_mul_nsw (i32 %x ) {
921921; CHECK-LABEL: @lshr_shift_mul_nsw(
922922; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
923- ; CHECK-NEXT: [[RES:%.*]] = mul nuw nsw i32 [[A]], 9
923+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[A]], [[X]]
924924; CHECK-NEXT: ret i32 [[RES]]
925925;
926926 %a = lshr exact i32 %x , 3
@@ -954,13 +954,11 @@ define i32 @ashr_no_exact(i32 %x) {
954954 ret i32 %res
955955}
956956
957- ; Negative test
958-
959957define i32 @lshr_multiuse (i32 %x ) {
960958; CHECK-LABEL: @lshr_multiuse(
961959; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
962960; CHECK-NEXT: call void @use(i32 [[A]])
963- ; CHECK-NEXT: [[RES:%.*]] = mul nuw nsw i32 [[A]], 9
961+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[A]], [[X]]
964962; CHECK-NEXT: ret i32 [[RES]]
965963;
966964 %a = lshr exact i32 %x , 3
@@ -969,13 +967,42 @@ define i32 @lshr_multiuse(i32 %x) {
969967 ret i32 %res
970968}
971969
970+
971+ ; Negative test
972+
973+ define i32 @lshr_multiuse_no_flags (i32 %x ) {
974+ ; CHECK-LABEL: @lshr_multiuse_no_flags(
975+ ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
976+ ; CHECK-NEXT: call void @use(i32 [[A]])
977+ ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[A]], 9
978+ ; CHECK-NEXT: ret i32 [[RES]]
979+ ;
980+ %a = lshr exact i32 %x , 3
981+ call void @use (i32 %a )
982+ %res = mul i32 %a , 9
983+ ret i32 %res
984+ }
985+
972986; Negative test
973987
988+ define i32 @ashr_multiuse_no_flags (i32 %x ) {
989+ ; CHECK-LABEL: @ashr_multiuse_no_flags(
990+ ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
991+ ; CHECK-NEXT: call void @use(i32 [[A]])
992+ ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[A]], 9
993+ ; CHECK-NEXT: ret i32 [[RES]]
994+ ;
995+ %a = ashr exact i32 %x , 3
996+ call void @use (i32 %a )
997+ %res = mul i32 %a , 9
998+ ret i32 %res
999+ }
1000+
9741001define i32 @ashr_multiuse (i32 %x ) {
9751002; CHECK-LABEL: @ashr_multiuse(
9761003; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
9771004; CHECK-NEXT: call void @use(i32 [[A]])
978- ; CHECK-NEXT: [[RES:%.*]] = mul nsw i32 [[A]], 9
1005+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[A]], [[X]]
9791006; CHECK-NEXT: ret i32 [[RES]]
9801007;
9811008 %a = ashr exact i32 %x , 3
0 commit comments