|
2 | 2 | ; RUN: opt -passes=instcombine -S < %s | FileCheck %s
|
3 | 3 |
|
4 | 4 | declare void @use(i32)
|
| 5 | +declare void @usef32(float) |
5 | 6 |
|
6 | 7 | declare i32 @llvm.ctlz.i32(i32, i1)
|
7 | 8 | declare <3 x i17> @llvm.ctlz.v3i17(<3 x i17>, i1)
|
@@ -344,3 +345,29 @@ define double @test_fabs_select_fmf2(i1 %cond, double %a) {
|
344 | 345 | %fabs = call nnan ninf nsz double @llvm.fabs.f64(double %sel1)
|
345 | 346 | ret double %fabs
|
346 | 347 | }
|
| 348 | + |
| 349 | +define float @test_fabs_select_multiuse(i1 %cond, float %x) { |
| 350 | +; CHECK-LABEL: @test_fabs_select_multiuse( |
| 351 | +; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND:%.*]], float [[X:%.*]], float 0x7FF0000000000000 |
| 352 | +; CHECK-NEXT: call void @usef32(float [[SELECT]]) |
| 353 | +; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]]) |
| 354 | +; CHECK-NEXT: ret float [[FABS]] |
| 355 | +; |
| 356 | + %select = select i1 %cond, float %x, float 0x7FF0000000000000 |
| 357 | + call void @usef32(float %select) |
| 358 | + %fabs = call float @llvm.fabs.f32(float %select) |
| 359 | + ret float %fabs |
| 360 | +} |
| 361 | + |
| 362 | +define float @test_fabs_select_multiuse_both_constant(i1 %cond, float %x) { |
| 363 | +; CHECK-LABEL: @test_fabs_select_multiuse_both_constant( |
| 364 | +; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND:%.*]], float -1.000000e+00, float -2.000000e+00 |
| 365 | +; CHECK-NEXT: call void @usef32(float [[SELECT]]) |
| 366 | +; CHECK-NEXT: [[FABS:%.*]] = select i1 [[COND]], float 1.000000e+00, float 2.000000e+00 |
| 367 | +; CHECK-NEXT: ret float [[FABS]] |
| 368 | +; |
| 369 | + %select = select i1 %cond, float -1.0, float -2.0 |
| 370 | + call void @usef32(float %select) |
| 371 | + %fabs = call float @llvm.fabs.f32(float %select) |
| 372 | + ret float %fabs |
| 373 | +} |
0 commit comments