|
5 | 5 |
|
6 | 6 | target datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64" |
7 | 7 |
|
| 8 | +declare void @use.i1(i1) |
| 9 | +declare void @use.i32(i32) |
| 10 | + |
8 | 11 | define i1 @test5(i1 %C) { |
9 | 12 | ; CHECK-LABEL: @test5( |
10 | 13 | ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C:%.*]], true |
@@ -4436,6 +4439,40 @@ define i32 @src_no_trans_select_and_eq0_xor_and(i32 %x, i32 %y) { |
4436 | 4439 | ret i32 %cond |
4437 | 4440 | } |
4438 | 4441 |
|
| 4442 | +define i32 @src_no_trans_select_and_eq0_xor_and_fail_multiuse(i32 %x, i32 %y) { |
| 4443 | +; CHECK-LABEL: @src_no_trans_select_and_eq0_xor_and_fail_multiuse( |
| 4444 | +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] |
| 4445 | +; CHECK-NEXT: [[AND0:%.*]] = icmp eq i32 [[AND]], 0 |
| 4446 | +; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[X]], [[Y]] |
| 4447 | +; CHECK-NEXT: call void @use.i32(i32 [[XOR]]) |
| 4448 | +; CHECK-NEXT: [[COND:%.*]] = select i1 [[AND0]], i32 [[XOR]], i32 [[AND]] |
| 4449 | +; CHECK-NEXT: ret i32 [[COND]] |
| 4450 | +; |
| 4451 | + %and = and i32 %x, %y |
| 4452 | + %and0 = icmp eq i32 %and, 0 |
| 4453 | + %xor = xor i32 %x, %y |
| 4454 | + call void @use.i32(i32 %xor) |
| 4455 | + %cond = select i1 %and0, i32 %xor, i32 %and |
| 4456 | + ret i32 %cond |
| 4457 | +} |
| 4458 | + |
| 4459 | +define i32 @src_no_trans_select_and_eq0_add(i32 %x, i32 %y, i32 %z) { |
| 4460 | +; CHECK-LABEL: @src_no_trans_select_and_eq0_add( |
| 4461 | +; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] |
| 4462 | +; CHECK-NEXT: [[AND0:%.*]] = icmp ne i32 [[AND]], 0 |
| 4463 | +; CHECK-NEXT: call void @use.i1(i1 [[AND0]]) |
| 4464 | +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[X]], [[Y]] |
| 4465 | +; CHECK-NEXT: [[COND:%.*]] = select i1 [[AND0]], i32 [[Z:%.*]], i32 [[ADD]] |
| 4466 | +; CHECK-NEXT: ret i32 [[COND]] |
| 4467 | +; |
| 4468 | + %and = and i32 %x, %y |
| 4469 | + %and0 = icmp ne i32 %and, 0 |
| 4470 | + call void @use.i1(i1 %and0) |
| 4471 | + %add = add i32 %x, %y |
| 4472 | + %cond = select i1 %and0, i32 %z, i32 %add |
| 4473 | + ret i32 %cond |
| 4474 | +} |
| 4475 | + |
4439 | 4476 | define i32 @src_no_trans_select_or_eq0_or_and(i32 %x, i32 %y) { |
4440 | 4477 | ; CHECK-LABEL: @src_no_trans_select_or_eq0_or_and( |
4441 | 4478 | ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], [[Y:%.*]] |
|
0 commit comments