@@ -1075,10 +1075,12 @@ entry:
10751075 call void @use (i32 %and )
10761076 %shr = ashr i32 %and , 31
10771077 ret i32 %shr
1078+ }
1079+
10781080define i32 @ashr_shift_mul (i32 noundef %x ) {
10791081; CHECK-LABEL: @ashr_shift_mul(
10801082; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
1081- ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[A ]], 9
1083+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X ]], [[A]]
10821084; CHECK-NEXT: ret i32 [[RES]]
10831085;
10841086 %a = ashr exact i32 %x , 3
@@ -1088,8 +1090,8 @@ define i32 @ashr_shift_mul(i32 noundef %x) {
10881090
10891091define i32 @ashr_shift_mul_nuw (i32 noundef %x ) {
10901092; CHECK-LABEL: @ashr_shift_mul_nuw(
1091- ; CHECK-NEXT: [[A :%.*]] = ashr exact i32 [[X:%.*]], 3
1092- ; CHECK-NEXT: [[RES:%.*]] = mul nuw i32 [[A ]], 9
1093+ ; CHECK-NEXT: [[TMP1 :%.*]] = lshr exact i32 [[X:%.*]], 3
1094+ ; CHECK-NEXT: [[RES:%.*]] = add nuw i32 [[X ]], [[TMP1]]
10931095; CHECK-NEXT: ret i32 [[RES]]
10941096;
10951097 %a = ashr exact i32 %x , 3
@@ -1100,7 +1102,7 @@ define i32 @ashr_shift_mul_nuw(i32 noundef %x) {
11001102define i32 @ashr_shift_mul_nsw (i32 noundef %x ) {
11011103; CHECK-LABEL: @ashr_shift_mul_nsw(
11021104; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
1103- ; CHECK-NEXT: [[RES:%.*]] = mul nsw i32 [[A ]], 9
1105+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X ]], [[A]]
11041106; CHECK-NEXT: ret i32 [[RES]]
11051107;
11061108 %a = ashr exact i32 %x , 3
@@ -1111,7 +1113,7 @@ define i32 @ashr_shift_mul_nsw(i32 noundef %x) {
11111113define i32 @lshr_shift_mul_nuw (i32 noundef %x ) {
11121114; CHECK-LABEL: @lshr_shift_mul_nuw(
11131115; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1114- ; CHECK-NEXT: [[RES:%.*]] = mul nuw i32 [[A ]], 9
1116+ ; CHECK-NEXT: [[RES:%.*]] = add nuw i32 [[X ]], [[A]]
11151117; CHECK-NEXT: ret i32 [[RES]]
11161118;
11171119 %a = lshr exact i32 %x , 3
@@ -1122,7 +1124,7 @@ define i32 @lshr_shift_mul_nuw(i32 noundef %x) {
11221124define i32 @lshr_shift_mul (i32 noundef %x ) {
11231125; CHECK-LABEL: @lshr_shift_mul(
11241126; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1125- ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[A ]], 9
1127+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X ]], [[A]]
11261128; CHECK-NEXT: ret i32 [[RES]]
11271129;
11281130 %a = lshr exact i32 %x , 3
@@ -1133,7 +1135,7 @@ define i32 @lshr_shift_mul(i32 noundef %x) {
11331135define i32 @lshr_shift_mul_nsw (i32 noundef %x ) {
11341136; CHECK-LABEL: @lshr_shift_mul_nsw(
11351137; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1136- ; CHECK-NEXT: [[RES:%.*]] = mul nuw nsw i32 [[A ]], 9
1138+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X ]], [[A]]
11371139; CHECK-NEXT: ret i32 [[RES]]
11381140;
11391141 %a = lshr exact i32 %x , 3
@@ -1169,8 +1171,8 @@ define i32 @ashr_no_exact(i32 %x) {
11691171
11701172define i32 @lshr_no_undef (i32 %x ) {
11711173; CHECK-LABEL: @lshr_no_undef(
1172- ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X :%.*]], 3
1173- ; CHECK-NEXT: [[RES:%.*]] = mul nuw nsw i32 [[A ]], 9
1174+ ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X_FR :%.*]], 3
1175+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X_FR ]], [[A]]
11741176; CHECK-NEXT: ret i32 [[RES]]
11751177;
11761178 %a = lshr exact i32 %x , 3
@@ -1180,8 +1182,8 @@ define i32 @lshr_no_undef(i32 %x) {
11801182
11811183define i32 @ashr_no_undef (i32 %x ) {
11821184; CHECK-LABEL: @ashr_no_undef(
1183- ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X :%.*]], 3
1184- ; CHECK-NEXT: [[RES:%.*]] = mul nsw i32 [[A ]], 9
1185+ ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X_FR :%.*]], 3
1186+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X_FR ]], [[A]]
11851187; CHECK-NEXT: ret i32 [[RES]]
11861188;
11871189 %a = ashr exact i32 %x , 3
@@ -1193,7 +1195,7 @@ define i32 @lshr_multiuse(i32 noundef %x) {
11931195; CHECK-LABEL: @lshr_multiuse(
11941196; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
11951197; CHECK-NEXT: call void @use(i32 [[A]])
1196- ; CHECK-NEXT: [[RES:%.*]] = mul nuw nsw i32 [[A ]], 9
1198+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X ]], [[A]]
11971199; CHECK-NEXT: ret i32 [[RES]]
11981200;
11991201 %a = lshr exact i32 %x , 3
@@ -1206,7 +1208,7 @@ define i32 @lshr_multiuse_no_flags(i32 noundef %x) {
12061208; CHECK-LABEL: @lshr_multiuse_no_flags(
12071209; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
12081210; CHECK-NEXT: call void @use(i32 [[A]])
1209- ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[A ]], 9
1211+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X ]], [[A]]
12101212; CHECK-NEXT: ret i32 [[RES]]
12111213;
12121214 %a = lshr exact i32 %x , 3
@@ -1219,7 +1221,7 @@ define i32 @ashr_multiuse_no_flags(i32 noundef %x) {
12191221; CHECK-LABEL: @ashr_multiuse_no_flags(
12201222; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
12211223; CHECK-NEXT: call void @use(i32 [[A]])
1222- ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[A ]], 9
1224+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X ]], [[A]]
12231225; CHECK-NEXT: ret i32 [[RES]]
12241226;
12251227 %a = ashr exact i32 %x , 3
@@ -1232,7 +1234,7 @@ define i32 @ashr_multiuse(i32 noundef %x) {
12321234; CHECK-LABEL: @ashr_multiuse(
12331235; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
12341236; CHECK-NEXT: call void @use(i32 [[A]])
1235- ; CHECK-NEXT: [[RES:%.*]] = mul nsw i32 [[A ]], 9
1237+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X ]], [[A]]
12361238; CHECK-NEXT: ret i32 [[RES]]
12371239;
12381240 %a = ashr exact i32 %x , 3
0 commit comments