|
65 | 65 | define i32 @test_sroa_phi_gep_poison(i1 %cond) {
|
66 | 66 | ; CHECK-LABEL: @test_sroa_phi_gep_poison(
|
67 | 67 | ; CHECK-NEXT: entry:
|
68 |
| -; CHECK-NEXT: [[A:%.*]] = alloca [[PAIR:%.*]], align 4 |
69 | 68 | ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[END:%.*]]
|
70 | 69 | ; CHECK: if.then:
|
| 70 | +; CHECK-NEXT: [[PHI_SROA_PHI_SROA_SPECULATE_LOAD_IF_THEN:%.*]] = load i32, ptr poison, align 4 |
71 | 71 | ; CHECK-NEXT: br label [[END]]
|
72 | 72 | ; CHECK: end:
|
73 |
| -; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[A]], [[ENTRY:%.*]] ], [ poison, [[IF_THEN]] ] |
74 |
| -; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [[PAIR]], ptr [[PHI]], i32 0, i32 1 |
75 |
| -; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4 |
76 |
| -; CHECK-NEXT: ret i32 [[LOAD]] |
| 73 | +; CHECK-NEXT: [[PHI_SROA_PHI_SROA_SPECULATED:%.*]] = phi i32 [ undef, [[ENTRY:%.*]] ], [ [[PHI_SROA_PHI_SROA_SPECULATE_LOAD_IF_THEN]], [[IF_THEN]] ] |
| 74 | +; CHECK-NEXT: ret i32 [[PHI_SROA_PHI_SROA_SPECULATED]] |
77 | 75 | ;
|
78 | 76 | entry:
|
79 | 77 | %a = alloca %pair, align 4
|
|
94 | 92 | define i32 @test_sroa_phi_gep_global(i1 %cond) {
|
95 | 93 | ; CHECK-LABEL: @test_sroa_phi_gep_global(
|
96 | 94 | ; CHECK-NEXT: entry:
|
97 |
| -; CHECK-NEXT: [[A:%.*]] = alloca [[PAIR:%.*]], align 4 |
98 |
| -; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds [[PAIR]], ptr [[A]], i32 0, i32 1 |
99 |
| -; CHECK-NEXT: store i32 1, ptr [[GEP_A]], align 4 |
100 | 95 | ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[END:%.*]]
|
101 | 96 | ; CHECK: if.then:
|
| 97 | +; CHECK-NEXT: [[PHI_SROA_PHI_SROA_SPECULATE_LOAD_IF_THEN:%.*]] = load i32, ptr getelementptr inbounds ([[PAIR:%.*]], ptr @g, i32 0, i32 1), align 4 |
102 | 98 | ; CHECK-NEXT: br label [[END]]
|
103 | 99 | ; CHECK: end:
|
104 |
| -; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[A]], [[ENTRY:%.*]] ], [ @g, [[IF_THEN]] ] |
105 |
| -; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [[PAIR]], ptr [[PHI]], i32 0, i32 1 |
106 |
| -; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4 |
107 |
| -; CHECK-NEXT: ret i32 [[LOAD]] |
| 100 | +; CHECK-NEXT: [[PHI_SROA_PHI_SROA_SPECULATED:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[PHI_SROA_PHI_SROA_SPECULATE_LOAD_IF_THEN]], [[IF_THEN]] ] |
| 101 | +; CHECK-NEXT: ret i32 [[PHI_SROA_PHI_SROA_SPECULATED]] |
108 | 102 | ;
|
109 | 103 | entry:
|
110 | 104 | %a = alloca %pair, align 4
|
@@ -245,15 +239,15 @@ define i32 @test_sroa_invoke_phi_gep(i1 %cond) personality ptr @__gxx_personalit
|
245 | 239 | ; CHECK-NEXT: br i1 [[COND:%.*]], label [[CALL:%.*]], label [[END:%.*]]
|
246 | 240 | ; CHECK: call:
|
247 | 241 | ; CHECK-NEXT: [[B:%.*]] = invoke ptr @foo()
|
248 |
| -; CHECK-NEXT: to label [[END]] unwind label [[INVOKE_CATCH:%.*]] |
| 242 | +; CHECK-NEXT: to label [[END]] unwind label [[INVOKE_CATCH:%.*]] |
249 | 243 | ; CHECK: end:
|
250 | 244 | ; CHECK-NEXT: [[PHI:%.*]] = phi ptr [ [[A]], [[ENTRY:%.*]] ], [ [[B]], [[CALL]] ]
|
251 | 245 | ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [[PAIR]], ptr [[PHI]], i32 0, i32 1
|
252 | 246 | ; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4
|
253 | 247 | ; CHECK-NEXT: ret i32 [[LOAD]]
|
254 | 248 | ; CHECK: invoke_catch:
|
255 | 249 | ; CHECK-NEXT: [[RES:%.*]] = landingpad { ptr, i32 }
|
256 |
| -; CHECK-NEXT: catch ptr null |
| 250 | +; CHECK-NEXT: catch ptr null |
257 | 251 | ; CHECK-NEXT: ret i32 0
|
258 | 252 | ;
|
259 | 253 | entry:
|
@@ -468,10 +462,10 @@ define i32 @test_sroa_phi_gep_multiple_values_from_same_block(i32 %arg) {
|
468 | 462 | ; CHECK-LABEL: @test_sroa_phi_gep_multiple_values_from_same_block(
|
469 | 463 | ; CHECK-NEXT: bb.1:
|
470 | 464 | ; CHECK-NEXT: switch i32 [[ARG:%.*]], label [[BB_3:%.*]] [
|
471 |
| -; CHECK-NEXT: i32 1, label [[BB_2:%.*]] |
472 |
| -; CHECK-NEXT: i32 2, label [[BB_2]] |
473 |
| -; CHECK-NEXT: i32 3, label [[BB_4:%.*]] |
474 |
| -; CHECK-NEXT: i32 4, label [[BB_4]] |
| 465 | +; CHECK-NEXT: i32 1, label [[BB_2:%.*]] |
| 466 | +; CHECK-NEXT: i32 2, label [[BB_2]] |
| 467 | +; CHECK-NEXT: i32 3, label [[BB_4:%.*]] |
| 468 | +; CHECK-NEXT: i32 4, label [[BB_4]] |
475 | 469 | ; CHECK-NEXT: ]
|
476 | 470 | ; CHECK: bb.2:
|
477 | 471 | ; CHECK-NEXT: br label [[BB_4]]
|
@@ -504,6 +498,117 @@ bb.4: ; preds = %bb.1, %bb.1, %bb
|
504 | 498 | ret i32 %load
|
505 | 499 | }
|
506 | 500 |
|
| 501 | +define i64 @test_phi_idx_mem2reg_const(i1 %arg) { |
| 502 | +; CHECK-LABEL: @test_phi_idx_mem2reg_const( |
| 503 | +; CHECK-NEXT: bb: |
| 504 | +; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] |
| 505 | +; CHECK: bb1: |
| 506 | +; CHECK-NEXT: br label [[END:%.*]] |
| 507 | +; CHECK: bb2: |
| 508 | +; CHECK-NEXT: br label [[END]] |
| 509 | +; CHECK: end: |
| 510 | +; CHECK-NEXT: [[PHI_SROA_PHI_SROA_SPECULATED:%.*]] = phi i64 [ 2, [[BB1]] ], [ 3, [[BB2]] ] |
| 511 | +; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, [[BB1]] ], [ 1, [[BB2]] ] |
| 512 | +; CHECK-NEXT: ret i64 [[PHI_SROA_PHI_SROA_SPECULATED]] |
| 513 | +; |
| 514 | +bb: |
| 515 | + %alloca = alloca [2 x i64], align 8 |
| 516 | + %gep1 = getelementptr inbounds i64, ptr %alloca, i64 1 |
| 517 | + store i64 2, ptr %alloca |
| 518 | + store i64 3, ptr %gep1 |
| 519 | + br i1 %arg, label %bb1, label %bb2 |
| 520 | + |
| 521 | +bb1: |
| 522 | + br label %end |
| 523 | + |
| 524 | +bb2: |
| 525 | + br label %end |
| 526 | + |
| 527 | +end: |
| 528 | + %phi = phi i64 [ 0, %bb1 ], [ 1, %bb2 ] |
| 529 | + %getelementptr = getelementptr inbounds i64, ptr %alloca, i64 %phi |
| 530 | + %load = load i64, ptr %getelementptr |
| 531 | + ret i64 %load |
| 532 | +} |
| 533 | + |
| 534 | +define i64 @test_phi_idx_mem2reg_not_const(i1 %arg, i64 %idx) { |
| 535 | +; CHECK-LABEL: @test_phi_idx_mem2reg_not_const( |
| 536 | +; CHECK-NEXT: bb: |
| 537 | +; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [2 x i64], align 8 |
| 538 | +; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i64, ptr [[ALLOCA]], i64 1 |
| 539 | +; CHECK-NEXT: store i64 2, ptr [[ALLOCA]], align 4 |
| 540 | +; CHECK-NEXT: store i64 3, ptr [[GEP1]], align 4 |
| 541 | +; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] |
| 542 | +; CHECK: bb1: |
| 543 | +; CHECK-NEXT: br label [[END:%.*]] |
| 544 | +; CHECK: bb2: |
| 545 | +; CHECK-NEXT: br label [[END]] |
| 546 | +; CHECK: end: |
| 547 | +; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, [[BB1]] ], [ [[IDX:%.*]], [[BB2]] ] |
| 548 | +; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr inbounds i64, ptr [[ALLOCA]], i64 [[PHI]] |
| 549 | +; CHECK-NEXT: [[LOAD:%.*]] = load i64, ptr [[GETELEMENTPTR]], align 4 |
| 550 | +; CHECK-NEXT: ret i64 [[LOAD]] |
| 551 | +; |
| 552 | +bb: |
| 553 | + %alloca = alloca [2 x i64], align 8 |
| 554 | + %gep1 = getelementptr inbounds i64, ptr %alloca, i64 1 |
| 555 | + store i64 2, ptr %alloca |
| 556 | + store i64 3, ptr %gep1 |
| 557 | + br i1 %arg, label %bb1, label %bb2 |
| 558 | + |
| 559 | +bb1: |
| 560 | + br label %end |
| 561 | + |
| 562 | +bb2: |
| 563 | + br label %end |
| 564 | + |
| 565 | +end: |
| 566 | + %phi = phi i64 [ 0, %bb1 ], [ %idx, %bb2 ] |
| 567 | + %getelementptr = getelementptr inbounds i64, ptr %alloca, i64 %phi |
| 568 | + %load = load i64, ptr %getelementptr |
| 569 | + ret i64 %load |
| 570 | +} |
| 571 | + |
| 572 | +define i64 @test_phi_mem2reg_pointer_op_is_non_const_gep(i1 %arg, i64 %idx) { |
| 573 | +; CHECK-LABEL: @test_phi_mem2reg_pointer_op_is_non_const_gep( |
| 574 | +; CHECK-NEXT: bb: |
| 575 | +; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [2 x i64], align 8 |
| 576 | +; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i64, ptr [[ALLOCA]], i64 1 |
| 577 | +; CHECK-NEXT: store i64 2, ptr [[ALLOCA]], align 4 |
| 578 | +; CHECK-NEXT: store i64 3, ptr [[GEP1]], align 4 |
| 579 | +; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] |
| 580 | +; CHECK: bb1: |
| 581 | +; CHECK-NEXT: br label [[END:%.*]] |
| 582 | +; CHECK: bb2: |
| 583 | +; CHECK-NEXT: br label [[END]] |
| 584 | +; CHECK: end: |
| 585 | +; CHECK-NEXT: [[PHI:%.*]] = phi i64 [ 0, [[BB1]] ], [ 1, [[BB2]] ] |
| 586 | +; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr inbounds i64, ptr [[ALLOCA]], i64 [[IDX:%.*]] |
| 587 | +; CHECK-NEXT: [[GETELEMENTPTR2:%.*]] = getelementptr inbounds i64, ptr [[GETELEMENTPTR]], i64 [[PHI]] |
| 588 | +; CHECK-NEXT: [[LOAD:%.*]] = load i64, ptr [[GETELEMENTPTR]], align 4 |
| 589 | +; CHECK-NEXT: ret i64 [[LOAD]] |
| 590 | +; |
| 591 | +bb: |
| 592 | + %alloca = alloca [2 x i64], align 8 |
| 593 | + %gep1 = getelementptr inbounds i64, ptr %alloca, i64 1 |
| 594 | + store i64 2, ptr %alloca |
| 595 | + store i64 3, ptr %gep1 |
| 596 | + br i1 %arg, label %bb1, label %bb2 |
| 597 | + |
| 598 | +bb1: |
| 599 | + br label %end |
| 600 | + |
| 601 | +bb2: |
| 602 | + br label %end |
| 603 | + |
| 604 | +end: |
| 605 | + %phi = phi i64 [ 0, %bb1 ], [ 1, %bb2 ] |
| 606 | + %getelementptr = getelementptr inbounds i64, ptr %alloca, i64 %idx |
| 607 | + %getelementptr2 = getelementptr inbounds i64, ptr %getelementptr, i64 %phi |
| 608 | + %load = load i64, ptr %getelementptr |
| 609 | + ret i64 %load |
| 610 | +} |
| 611 | + |
507 | 612 | declare ptr @foo()
|
508 | 613 |
|
509 | 614 | declare i32 @__gxx_personality_v0(...)
|
|
0 commit comments