|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
2 | 2 | ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
|
3 | 3 |
|
| 4 | +declare void @use(i64) |
| 5 | + |
4 | 6 | define i8 @shl_and(i8 %x, i8 %y) {
|
5 | 7 | ; CHECK-LABEL: @shl_and(
|
6 | 8 | ; CHECK-NEXT: [[TMP1:%.*]] = shl i8 [[X:%.*]], 5
|
@@ -254,3 +256,71 @@ define i32 @PR44028(i32 %x) {
|
254 | 256 | %t27 = ashr exact i32 %t0, 16
|
255 | 257 | ret i32 %t27
|
256 | 258 | }
|
| 259 | + |
| 260 | +define i64 @lshr_mul(i64 %0) { |
| 261 | +; CHECK-LABEL: @lshr_mul( |
| 262 | +; CHECK-NEXT: [[TMP2:%.*]] = mul nuw i64 [[TMP0:%.*]], 52 |
| 263 | +; CHECK-NEXT: [[TMP3:%.*]] = lshr exact i64 [[TMP2]], 2 |
| 264 | +; CHECK-NEXT: ret i64 [[TMP3]] |
| 265 | +; |
| 266 | + %2 = mul nuw i64 %0, 52 |
| 267 | + %3 = lshr i64 %2, 2 |
| 268 | + ret i64 %3 |
| 269 | +} |
| 270 | + |
| 271 | +define i64 @lshr_mul_nuw_nsw(i64 %0) { |
| 272 | +; CHECK-LABEL: @lshr_mul_nuw_nsw( |
| 273 | +; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw i64 [[TMP0:%.*]], 52 |
| 274 | +; CHECK-NEXT: [[TMP3:%.*]] = lshr exact i64 [[TMP2]], 2 |
| 275 | +; CHECK-NEXT: ret i64 [[TMP3]] |
| 276 | +; |
| 277 | + %2 = mul nuw nsw i64 %0, 52 |
| 278 | + %3 = lshr i64 %2, 2 |
| 279 | + ret i64 %3 |
| 280 | +} |
| 281 | + |
| 282 | +define <4 x i32> @lshr_mul_vector(<4 x i32> %0) { |
| 283 | +; CHECK-LABEL: @lshr_mul_vector( |
| 284 | +; CHECK-NEXT: [[TMP2:%.*]] = mul nuw <4 x i32> [[TMP0:%.*]], <i32 52, i32 52, i32 52, i32 52> |
| 285 | +; CHECK-NEXT: [[TMP3:%.*]] = lshr exact <4 x i32> [[TMP2]], <i32 2, i32 2, i32 2, i32 2> |
| 286 | +; CHECK-NEXT: ret <4 x i32> [[TMP3]] |
| 287 | +; |
| 288 | + %2 = mul nuw <4 x i32> %0, <i32 52, i32 52, i32 52, i32 52> |
| 289 | + %3 = lshr <4 x i32> %2, <i32 2, i32 2, i32 2, i32 2> |
| 290 | + ret <4 x i32> %3 |
| 291 | +} |
| 292 | + |
| 293 | +define i64 @lshr_mul_negative_noexact(i64 %0) { |
| 294 | +; CHECK-LABEL: @lshr_mul_negative_noexact( |
| 295 | +; CHECK-NEXT: [[TMP2:%.*]] = mul nuw i64 [[TMP0:%.*]], 53 |
| 296 | +; CHECK-NEXT: [[TMP3:%.*]] = lshr i64 [[TMP2]], 2 |
| 297 | +; CHECK-NEXT: ret i64 [[TMP3]] |
| 298 | +; |
| 299 | + %2 = mul nuw i64 %0, 53 |
| 300 | + %3 = lshr i64 %2, 2 |
| 301 | + ret i64 %3 |
| 302 | +} |
| 303 | + |
| 304 | +define i64 @lshr_mul_negative_oneuse(i64 %0) { |
| 305 | +; CHECK-LABEL: @lshr_mul_negative_oneuse( |
| 306 | +; CHECK-NEXT: [[TMP2:%.*]] = mul nuw i64 [[TMP0:%.*]], 52 |
| 307 | +; CHECK-NEXT: call void @use(i64 [[TMP2]]) |
| 308 | +; CHECK-NEXT: [[TMP3:%.*]] = lshr exact i64 [[TMP2]], 2 |
| 309 | +; CHECK-NEXT: ret i64 [[TMP3]] |
| 310 | +; |
| 311 | + %2 = mul nuw i64 %0, 52 |
| 312 | + call void @use(i64 %2) |
| 313 | + %3 = lshr i64 %2, 2 |
| 314 | + ret i64 %3 |
| 315 | +} |
| 316 | + |
| 317 | +define i64 @lshr_mul_negative_nonuw(i64 %0) { |
| 318 | +; CHECK-LABEL: @lshr_mul_negative_nonuw( |
| 319 | +; CHECK-NEXT: [[TMP2:%.*]] = mul i64 [[TMP0:%.*]], 52 |
| 320 | +; CHECK-NEXT: [[TMP3:%.*]] = lshr exact i64 [[TMP2]], 2 |
| 321 | +; CHECK-NEXT: ret i64 [[TMP3]] |
| 322 | +; |
| 323 | + %2 = mul i64 %0, 52 |
| 324 | + %3 = lshr i64 %2, 2 |
| 325 | + ret i64 %3 |
| 326 | +} |
0 commit comments