@@ -1077,4 +1077,148 @@ entry:
1077
1077
ret i32 %shr
1078
1078
}
1079
1079
1080
+ define i32 @ashr_shift_mul (i32 %x ) {
1081
+ ; CHECK-LABEL: @ashr_shift_mul(
1082
+ ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
1083
+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X]], [[A]]
1084
+ ; CHECK-NEXT: ret i32 [[RES]]
1085
+ ;
1086
+ %a = ashr exact i32 %x , 3
1087
+ %res = mul i32 %a , 9
1088
+ ret i32 %res
1089
+ }
1090
+
1091
+ define i32 @ashr_shift_mul_nuw (i32 %x ) {
1092
+ ; CHECK-LABEL: @ashr_shift_mul_nuw(
1093
+ ; CHECK-NEXT: [[TMP1:%.*]] = lshr exact i32 [[X:%.*]], 3
1094
+ ; CHECK-NEXT: [[RES:%.*]] = add nuw i32 [[X]], [[TMP1]]
1095
+ ; CHECK-NEXT: ret i32 [[RES]]
1096
+ ;
1097
+ %a = ashr exact i32 %x , 3
1098
+ %res = mul nuw i32 %a , 9
1099
+ ret i32 %res
1100
+ }
1101
+
1102
+ define i32 @ashr_shift_mul_nsw (i32 %x ) {
1103
+ ; CHECK-LABEL: @ashr_shift_mul_nsw(
1104
+ ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
1105
+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X]], [[A]]
1106
+ ; CHECK-NEXT: ret i32 [[RES]]
1107
+ ;
1108
+ %a = ashr exact i32 %x , 3
1109
+ %res = mul nsw i32 %a , 9
1110
+ ret i32 %res
1111
+ }
1112
+
1113
+ define i32 @lshr_shift_mul_nuw (i32 %x ) {
1114
+ ; CHECK-LABEL: @lshr_shift_mul_nuw(
1115
+ ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1116
+ ; CHECK-NEXT: [[RES:%.*]] = add nuw i32 [[X]], [[A]]
1117
+ ; CHECK-NEXT: ret i32 [[RES]]
1118
+ ;
1119
+ %a = lshr exact i32 %x , 3
1120
+ %res = mul nuw i32 %a , 9
1121
+ ret i32 %res
1122
+ }
1123
+
1124
+ define i32 @lshr_shift_mul (i32 %x ) {
1125
+ ; CHECK-LABEL: @lshr_shift_mul(
1126
+ ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1127
+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X]], [[A]]
1128
+ ; CHECK-NEXT: ret i32 [[RES]]
1129
+ ;
1130
+ %a = lshr exact i32 %x , 3
1131
+ %res = mul i32 %a , 9
1132
+ ret i32 %res
1133
+ }
1134
+
1135
+ define i32 @lshr_shift_mul_nsw (i32 %x ) {
1136
+ ; CHECK-LABEL: @lshr_shift_mul_nsw(
1137
+ ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1138
+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X]], [[A]]
1139
+ ; CHECK-NEXT: ret i32 [[RES]]
1140
+ ;
1141
+ %a = lshr exact i32 %x , 3
1142
+ %res = mul nsw i32 %a , 9
1143
+ ret i32 %res
1144
+ }
1145
+
1146
+ ; Negative test
1147
+
1148
+ define i32 @lshr_no_exact (i32 %x ) {
1149
+ ; CHECK-LABEL: @lshr_no_exact(
1150
+ ; CHECK-NEXT: [[A:%.*]] = lshr i32 [[X:%.*]], 3
1151
+ ; CHECK-NEXT: [[RES:%.*]] = mul nuw nsw i32 [[A]], 9
1152
+ ; CHECK-NEXT: ret i32 [[RES]]
1153
+ ;
1154
+ %a = lshr i32 %x , 3
1155
+ %res = mul nsw i32 %a , 9
1156
+ ret i32 %res
1157
+ }
1158
+
1159
+ ; Negative test
1160
+
1161
+ define i32 @ashr_no_exact (i32 %x ) {
1162
+ ; CHECK-LABEL: @ashr_no_exact(
1163
+ ; CHECK-NEXT: [[A:%.*]] = ashr i32 [[X:%.*]], 3
1164
+ ; CHECK-NEXT: [[RES:%.*]] = mul nsw i32 [[A]], 9
1165
+ ; CHECK-NEXT: ret i32 [[RES]]
1166
+ ;
1167
+ %a = ashr i32 %x , 3
1168
+ %res = mul nsw i32 %a , 9
1169
+ ret i32 %res
1170
+ }
1171
+
1172
+ define i32 @lshr_multiuse (i32 %x ) {
1173
+ ; CHECK-LABEL: @lshr_multiuse(
1174
+ ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1175
+ ; CHECK-NEXT: call void @use(i32 [[A]])
1176
+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X]], [[A]]
1177
+ ; CHECK-NEXT: ret i32 [[RES]]
1178
+ ;
1179
+ %a = lshr exact i32 %x , 3
1180
+ call void @use (i32 %a )
1181
+ %res = mul nsw i32 %a , 9
1182
+ ret i32 %res
1183
+ }
1184
+
1185
+ define i32 @lshr_multiuse_no_flags (i32 %x ) {
1186
+ ; CHECK-LABEL: @lshr_multiuse_no_flags(
1187
+ ; CHECK-NEXT: [[A:%.*]] = lshr exact i32 [[X:%.*]], 3
1188
+ ; CHECK-NEXT: call void @use(i32 [[A]])
1189
+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X]], [[A]]
1190
+ ; CHECK-NEXT: ret i32 [[RES]]
1191
+ ;
1192
+ %a = lshr exact i32 %x , 3
1193
+ call void @use (i32 %a )
1194
+ %res = mul i32 %a , 9
1195
+ ret i32 %res
1196
+ }
1197
+
1198
+ define i32 @ashr_multiuse_no_flags (i32 %x ) {
1199
+ ; CHECK-LABEL: @ashr_multiuse_no_flags(
1200
+ ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
1201
+ ; CHECK-NEXT: call void @use(i32 [[A]])
1202
+ ; CHECK-NEXT: [[RES:%.*]] = add i32 [[X]], [[A]]
1203
+ ; CHECK-NEXT: ret i32 [[RES]]
1204
+ ;
1205
+ %a = ashr exact i32 %x , 3
1206
+ call void @use (i32 %a )
1207
+ %res = mul i32 %a , 9
1208
+ ret i32 %res
1209
+ }
1210
+
1211
+ define i32 @ashr_multiuse (i32 %x ) {
1212
+ ; CHECK-LABEL: @ashr_multiuse(
1213
+ ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], 3
1214
+ ; CHECK-NEXT: call void @use(i32 [[A]])
1215
+ ; CHECK-NEXT: [[RES:%.*]] = add nsw i32 [[X]], [[A]]
1216
+ ; CHECK-NEXT: ret i32 [[RES]]
1217
+ ;
1218
+ %a = ashr exact i32 %x , 3
1219
+ call void @use (i32 %a )
1220
+ %res = mul nsw i32 %a , 9
1221
+ ret i32 %res
1222
+ }
1223
+
1080
1224
declare void @use (i32 )
0 commit comments