Skip to content

Commit 7736978

Browse files
committed
Reconstruct storage lifetimes after move elimination
1 parent 97d51a4 commit 7736978

23 files changed

Lines changed: 1115 additions & 59 deletions

‎compiler/rustc_mir_transform/src/move_elimination.rs‎

Lines changed: 353 additions & 6 deletions
Large diffs are not rendered by default.

‎tests/mir-opt/move-elimination/alias_fixup.aggregate_indirect_source_alias.MoveElimination.diff‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
- _3 = (copy (*_2), move _1);
1515
- _0 = copy _3;
1616
+ (_0.1: u8) = const 1_u8;
17+
+ StorageLive(_2);
1718
+ _2 = &raw const (_0.1: u8);
1819
+ StorageLive(_4);
1920
+ _4 = no_retag copy (*_2);
2021
+ (_0.0: u8) = no_retag move _4;
2122
+ nop;
2223
+ StorageDead(_4);
24+
+ StorageDead(_2);
2325
+ nop;
2426
return;
2527
}

‎tests/mir-opt/move-elimination/alias_fixup.aggregate_swap.MoveElimination.diff‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,6 @@
4141
- _7 = copy (_3.1: u8);
4242
- StorageLive(_8);
4343
- _8 = copy _7;
44-
- StorageLive(_9);
45-
- _9 = copy _6;
46-
- _3 = (move _8, move _9);
47-
- StorageDead(_9);
48-
- StorageDead(_8);
49-
- _0 = copy _3;
50-
- StorageDead(_7);
51-
- StorageDead(_6);
52-
- StorageDead(_3);
5344
+ nop;
5445
+ nop;
5546
+ nop;
@@ -59,6 +50,9 @@
5950
+ nop;
6051
+ nop;
6152
+ nop;
53+
StorageLive(_9);
54+
- _9 = copy _6;
55+
- _3 = (move _8, move _9);
6256
+ _9 = copy (_0.0: u8);
6357
+ nop;
6458
+ nop;
@@ -72,6 +66,12 @@
7266
+ (_0.1: u8) = no_retag move _9;
7367
+ nop;
7468
+ StorageDead(_10);
69+
StorageDead(_9);
70+
- StorageDead(_8);
71+
- _0 = copy _3;
72+
- StorageDead(_7);
73+
- StorageDead(_6);
74+
- StorageDead(_3);
7575
+ nop;
7676
+ nop;
7777
+ nop;

‎tests/mir-opt/move-elimination/alias_fixup.mixed_aggregate_aliasing.MoveElimination.diff‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
}
4747

4848
bb3: {
49-
- StorageLive(_6);
49+
+ nop;
50+
StorageLive(_6);
5051
- _6 = copy (_3.1: u8);
5152
- StorageLive(_7);
5253
- _7 = copy (_3.0: u8);
@@ -55,8 +56,6 @@
5556
- _4 = Triple(move _6, move _7, move _8);
5657
- StorageDead(_8);
5758
- StorageDead(_7);
58-
- StorageDead(_6);
59-
+ nop;
6059
+ _6 = copy (_0.1: u8);
6160
+ nop;
6261
+ nop;
@@ -69,6 +68,7 @@
6968
+ (_0.2: u8) = no_retag move _2;
7069
+ nop;
7170
+ StorageDead(_9);
71+
StorageDead(_6);
7272
+ nop;
7373
+ nop;
7474
+ nop;

‎tests/mir-opt/move-elimination/alias_fixup.simple_partial_alias.MoveElimination.diff‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,23 @@
2525
- StorageDead(_3);
2626
- StorageLive(_4);
2727
- _4 = copy (_2.0: [u8; 4]);
28-
- StorageLive(_5);
29-
- _5 = copy _4;
30-
- (_2.1: [u8; 4]) = move _5;
31-
- StorageDead(_5);
32-
- _0 = move _2;
33-
- StorageDead(_4);
34-
- StorageDead(_2);
3528
+ nop;
3629
+ nop;
3730
+ nop;
3831
+ _0 = U { a: move _1 };
3932
+ nop;
4033
+ nop;
34+
StorageLive(_5);
35+
- _5 = copy _4;
36+
- (_2.1: [u8; 4]) = move _5;
4137
+ _5 = copy (_0.0: [u8; 4]);
4238
+ nop;
4339
+ nop;
4440
+ (_0.1: [u8; 4]) = move _5;
41+
StorageDead(_5);
42+
- _0 = move _2;
43+
- StorageDead(_4);
44+
- StorageDead(_2);
4545
+ nop;
4646
+ nop;
4747
+ nop;

‎tests/mir-opt/move-elimination/basic.nrvo_borrowed.MoveElimination.diff‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,28 @@
1717
- _1 = [const 1_u8; 8];
1818
- StorageLive(_2);
1919
- StorageLive(_3);
20-
- StorageLive(_4);
21-
- _4 = &mut _1;
2220
+ nop;
2321
+ _0 = [const 1_u8; 8];
2422
+ nop;
2523
+ nop;
2624
+ nop;
25+
StorageLive(_4);
26+
- _4 = &mut _1;
2727
+ _4 = &mut _0;
28+
+ StorageLive(_3);
2829
_3 = &mut (*_4);
30+
+ StorageDead(_4);
31+
+ StorageLive(_2);
2932
_2 = init(move _3) -> [return: bb1, unwind unreachable];
3033
}
3134

3235
bb1: {
3336
- StorageDead(_3);
3437
- StorageDead(_4);
35-
- StorageDead(_2);
38+
StorageDead(_2);
3639
- _0 = move _1;
3740
- StorageDead(_1);
41+
+ StorageDead(_3);
3842
+ nop;
3943
+ nop;
4044
+ nop;

‎tests/mir-opt/move-elimination/dse.dse_guard.MoveElimination.diff‎

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222

2323
bb0: {
2424
- StorageLive(_1);
25-
- StorageLive(_2);
26-
- StorageLive(_3);
27-
- _3 = make_fields(const 0_u8) -> [return: bb1, unwind unreachable];
2825
+ nop;
2926
+ nop;
3027
+ nop;
28+
StorageLive(_2);
29+
- StorageLive(_3);
30+
- _3 = make_fields(const 0_u8) -> [return: bb1, unwind unreachable];
3131
+ _2 = make_fields(const 0_u8) -> [return: bb1, unwind unreachable];
3232
}
3333

@@ -39,52 +39,57 @@
3939
+ nop;
4040
+ nop;
4141
+ nop;
42+
+ StorageLive(_7);
4243
+ _7 = make_fields(const 1_u8) -> [return: bb2, unwind unreachable];
4344
}
4445

4546
bb2: {
4647
- _1 = move _4;
4748
- StorageDead(_4);
4849
- StorageLive(_5);
49-
- StorageLive(_6);
50-
- _6 = &raw const _1;
5150
+ nop;
5251
+ nop;
5352
+ nop;
5453
+ nop;
54+
StorageLive(_6);
55+
- _6 = &raw const _1;
5556
+ _6 = &raw const _7;
57+
+ StorageLive(_5);
5658
_5 = observe(move _6) -> [return: bb3, unwind unreachable];
5759
}
5860

5961
bb3: {
6062
- StorageDead(_6);
61-
- StorageDead(_5);
63+
StorageDead(_5);
6264
- StorageLive(_7);
6365
- _7 = move _1;
66+
+ StorageDead(_6);
6467
+ nop;
6568
+ nop;
6669
+ nop;
6770
+ nop;
6871
_2 = move _7;
69-
- StorageDead(_7);
72+
StorageDead(_7);
7073
- StorageLive(_8);
71-
- StorageLive(_9);
7274
+ nop;
7375
+ nop;
7476
+ nop;
77+
StorageLive(_9);
7578
_9 = &raw const _2;
79+
+ StorageLive(_8);
7680
_8 = observe(move _9) -> [return: bb4, unwind unreachable];
7781
}
7882

7983
bb4: {
8084
- StorageDead(_9);
81-
- StorageDead(_8);
85+
StorageDead(_8);
86+
+ StorageDead(_9);
8287
+ nop;
8388
+ nop;
8489
_0 = const ();
85-
- StorageDead(_2);
86-
- StorageDead(_1);
8790
+ nop;
91+
StorageDead(_2);
92+
- StorageDead(_1);
8893
+ nop;
8994
return;
9095
}

‎tests/mir-opt/move-elimination/dse.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ pub fn dse_guard() {
1919
// CHECK-LABEL: fn dse_guard(
2020
// CHECK: debug a => [[a:_.*]];
2121
// CHECK: debug b => [[b:_.*]];
22+
// CHECK: StorageLive([[b]]);
2223
// CHECK: [[b]] = make_fields(const 0_u8)
24+
// CHECK: StorageLive([[a]]);
2325
// CHECK: [[a]] = make_fields(const 1_u8)
2426
// CHECK: observe(move
2527
// CHECK: [[b]] = move [[a]]

‎tests/mir-opt/move-elimination/exclusions.index_local_not_projected.MoveElimination.diff‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@
77
let mut _3: usize;
88

99
bb0: {
10+
+ StorageLive(_2);
1011
_2 = const 2_usize;
12+
+ StorageLive(_3);
1113
_3 = copy _1[_2];
14+
+ StorageDead(_3);
1215
_0 = [copy _2];
16+
+ StorageDead(_2);
1317
return;
1418
}
1519
}

‎tests/mir-opt/move-elimination/exclusions.overlapping_lifetimes.MoveElimination.diff‎

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,28 +28,31 @@
2828
- StorageLive(_2);
2929
- _2 = make_fields(const 0_u8) -> [return: bb1, unwind unreachable];
3030
+ nop;
31+
+ StorageLive(_10);
3132
+ _10 = make_fields(const 0_u8) -> [return: bb1, unwind unreachable];
3233
}
3334

3435
bb1: {
3536
- StorageLive(_3);
3637
- StorageLive(_4);
37-
- StorageLive(_5);
38-
- _5 = &raw const _2;
3938
+ nop;
4039
+ nop;
4140
+ nop;
41+
StorageLive(_5);
42+
- _5 = &raw const _2;
4243
+ _5 = &raw const _10;
44+
+ StorageLive(_4);
4345
_4 = observe(move _5) -> [return: bb2, unwind unreachable];
4446
}
4547

4648
bb2: {
4749
- StorageDead(_5);
48-
- StorageDead(_4);
50+
StorageDead(_4);
4951
- StorageLive(_6);
5052
- StorageLive(_7);
5153
- _7 = copy _1;
5254
- switchInt(move _7) -> [0: bb5, otherwise: bb3];
55+
+ StorageDead(_5);
5356
+ nop;
5457
+ nop;
5558
+ nop;
@@ -77,44 +80,51 @@
7780
+ nop;
7881
+ nop;
7982
+ _0 = move _10;
83+
+ StorageDead(_10);
8084
+ nop;
85+
+ StorageLive(_6);
8186
_6 = const ();
87+
+ StorageDead(_6);
8288
goto -> bb6;
8389
}
8490

8591
bb5: {
8692
- StorageLive(_10);
8793
- _10 = move _2;
8894
- _3 = move _10;
89-
- StorageDead(_10);
9095
+ nop;
9196
+ nop;
9297
+ _0 = move _10;
98+
StorageDead(_10);
9399
+ nop;
100+
+ StorageLive(_6);
94101
_6 = const ();
102+
+ StorageDead(_6);
95103
goto -> bb6;
96104
}
97105

98106
bb6: {
99107
- StorageDead(_7);
100108
- StorageDead(_6);
101109
- StorageLive(_11);
102-
- StorageLive(_12);
103-
- _12 = &raw const _3;
104110
+ nop;
105111
+ nop;
106112
+ nop;
107113
+ nop;
114+
StorageLive(_12);
115+
- _12 = &raw const _3;
108116
+ _12 = &raw const _0;
117+
+ StorageLive(_11);
109118
_11 = observe(move _12) -> [return: bb7, unwind unreachable];
110119
}
111120

112121
bb7: {
113122
- StorageDead(_12);
114-
- StorageDead(_11);
123+
StorageDead(_11);
115124
- _0 = move _3;
116125
- StorageDead(_3);
117126
- StorageDead(_2);
127+
+ StorageDead(_12);
118128
+ nop;
119129
+ nop;
120130
+ nop;

0 commit comments

Comments
 (0)