|
54 | 54 | ret i32 %x
|
55 | 55 | }
|
56 | 56 |
|
| 57 | +; Do not PRE here because a loop-variant pointer. |
| 58 | +define i32 @test_load_on_cold_path_gc_variant_neg(i32 addrspace(1)* addrspace(1)* %pp) gc "statepoint-example" personality i32 ()* @"personality_function" { |
| 59 | +; CHECK-LABEL: @test_load_on_cold_path_gc_variant_neg( |
| 60 | +; CHECK-NEXT: entry: |
| 61 | +; CHECK-NEXT: br label [[LOOP:%.*]] |
| 62 | +; CHECK: loop: |
| 63 | +; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ] |
| 64 | +; CHECK-NEXT: [[P:%.*]] = load volatile i32 addrspace(1)*, i32 addrspace(1)* addrspace(1)* [[PP:%.*]], align 8 |
| 65 | +; CHECK-NEXT: [[X:%.*]] = load i32, i32 addrspace(1)* [[P]], align 4 |
| 66 | +; CHECK-NEXT: [[COND:%.*]] = icmp ne i32 [[X]], 0 |
| 67 | +; CHECK-NEXT: br i1 [[COND]], label [[HOT_PATH:%.*]], label [[COLD_PATH:%.*]] |
| 68 | +; CHECK: hot_path: |
| 69 | +; CHECK-NEXT: br label [[BACKEDGE]] |
| 70 | +; CHECK: cold_path: |
| 71 | +; CHECK-NEXT: call void @may_free_memory() |
| 72 | +; CHECK-NEXT: br label [[BACKEDGE]] |
| 73 | +; CHECK: backedge: |
| 74 | +; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], [[X]] |
| 75 | +; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 1000 |
| 76 | +; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]] |
| 77 | +; CHECK: exit: |
| 78 | +; CHECK-NEXT: ret i32 [[X]] |
| 79 | +; |
| 80 | +entry: |
| 81 | + br label %loop |
| 82 | + |
| 83 | +loop: |
| 84 | + %iv = phi i32 [ 0, %entry], [%iv.next, %backedge] |
| 85 | + %p = load volatile i32 addrspace(1)*, i32 addrspace(1)* addrspace(1)* %pp |
| 86 | + %x = load i32, i32 addrspace(1)* %p |
| 87 | + %cond = icmp ne i32 %x, 0 |
| 88 | + br i1 %cond, label %hot_path, label %cold_path |
| 89 | + |
| 90 | +hot_path: |
| 91 | + br label %backedge |
| 92 | + |
| 93 | +cold_path: |
| 94 | + call void @may_free_memory() |
| 95 | + br label %backedge |
| 96 | + |
| 97 | +backedge: |
| 98 | + %iv.next = add i32 %iv, %x |
| 99 | + %loop.cond = icmp ult i32 %iv.next, 1000 |
| 100 | + br i1 %loop.cond, label %loop, label %exit |
| 101 | + |
| 102 | +exit: |
| 103 | + ret i32 %x |
| 104 | +} |
| 105 | + |
| 106 | + |
57 | 107 | ; TODO: We can PRE the load away from the hot path.
|
58 | 108 | define i32 @test_load_on_cold_path(i32* %p) {
|
59 | 109 | ; CHECK-LABEL: @test_load_on_cold_path(
|
|
0 commit comments