Skip to content

Commit 05420b5

Browse files
committed
Simplify MIR drop generation
Now that EndRegion is gone, we don't need to create as many gotos.
1 parent 74bdf23 commit 05420b5

File tree

9 files changed

+301
-285
lines changed

9 files changed

+301
-285
lines changed

src/librustc_mir/build/scope.rs

Lines changed: 217 additions & 173 deletions
Large diffs are not rendered by default.

src/test/mir-opt/basic_assignment.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ fn main() {
6060
// StorageLive(_5);
6161
// StorageLive(_6);
6262
// _6 = move _4;
63-
// replace(_5 <- move _6) -> [return: bb2, unwind: bb5];
63+
// replace(_5 <- move _6) -> [return: bb1, unwind: bb5];
6464
// }
6565
// ...
66-
// bb2: {
66+
// bb1: {
6767
// drop(_6) -> [return: bb6, unwind: bb4];
6868
// }
6969
// ...

src/test/mir-opt/box_expr.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,20 @@ impl Drop for S {
4545
// StorageLive(_1);
4646
// StorageLive(_2);
4747
// _2 = Box(S);
48-
// (*_2) = const S::new() -> [return: bb2, unwind: bb3];
48+
// (*_2) = const S::new() -> [return: bb1, unwind: bb3];
4949
// }
5050
//
5151
// bb1: {
52-
// resume;
52+
// _1 = move _2;
53+
// drop(_2) -> bb4;
5354
// }
5455
//
5556
// bb2: {
56-
// _1 = move _2;
57-
// drop(_2) -> bb4;
57+
// resume;
5858
// }
5959
//
6060
// bb3: {
61-
// drop(_2) -> bb1;
61+
// drop(_2) -> bb2;
6262
// }
6363
//
6464
// bb4: {
@@ -73,7 +73,7 @@ impl Drop for S {
7373
// }
7474
//
7575
// bb6: {
76-
// drop(_1) -> bb1;
76+
// drop(_1) -> bb2;
7777
// }
7878
//
7979
// bb7: {

src/test/mir-opt/issue-38669.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,19 @@ fn main() {
2626
// StorageLive(_1);
2727
// _1 = const false;
2828
// FakeRead(ForLet, _1);
29-
// goto -> bb2;
29+
// goto -> bb1;
3030
// }
3131
// bb1: {
32-
// resume;
32+
// falseUnwind -> [real: bb2, cleanup: bb3];
3333
// }
3434
// bb2: {
35-
// falseUnwind -> [real: bb3, cleanup: bb1];
36-
// }
37-
// bb3: {
3835
// StorageLive(_4);
3936
// _4 = _1;
4037
// switchInt(move _4) -> [false: bb5, otherwise: bb4];
4138
// }
39+
// bb3: {
40+
// resume;
41+
// }
4242
// bb4: {
4343
// _0 = ();
4444
// StorageDead(_4);
@@ -50,6 +50,6 @@ fn main() {
5050
// StorageDead(_4);
5151
// _1 = const true;
5252
// _2 = ();
53-
// goto -> bb2;
53+
// goto -> bb1;
5454
// }
5555
// END rustc.main.SimplifyCfg-initial.after.mir

src/test/mir-opt/issue-49232.rs

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn main() {
4444
// falseUnwind -> [real: bb3, cleanup: bb4];
4545
// }
4646
// bb2: {
47-
// goto -> bb29;
47+
// goto -> bb20;
4848
// }
4949
// bb3: {
5050
// StorageLive(_2);
@@ -62,7 +62,7 @@ fn main() {
6262
// }
6363
// bb6: {
6464
// _0 = ();
65-
// goto -> bb15;
65+
// goto -> bb16;
6666
// }
6767
// bb7: {
6868
// falseEdges -> [real: bb12, imaginary: bb8];
@@ -90,58 +90,31 @@ fn main() {
9090
// StorageDead(_3);
9191
// StorageLive(_6);
9292
// _6 = &_2;
93-
// _5 = const std::mem::drop(move _6) -> [return: bb28, unwind: bb4];
93+
// _5 = const std::mem::drop(move _6) -> [return: bb19, unwind: bb4];
9494
// }
9595
// bb15: {
96-
// goto -> bb16;
96+
// StorageDead(_2);
97+
// goto -> bb2;
9798
// }
9899
// bb16: {
99-
// goto -> bb17;
100-
// }
101-
// bb17: {
102-
// goto -> bb18;
103-
// }
104-
// bb18: {
105-
// goto -> bb19;
106-
// }
107-
// bb19: {
108-
// goto -> bb20;
109-
// }
110-
// bb20: {
111100
// StorageDead(_3);
112-
// goto -> bb21;
113-
// }
114-
// bb21: {
115-
// goto -> bb22;
116-
// }
117-
// bb22: {
118-
// StorageDead(_2);
119-
// goto -> bb23;
120-
// }
121-
// bb23: {
122-
// goto -> bb24;
123-
// }
124-
// bb24: {
125-
// goto -> bb25;
126-
// }
127-
// bb25: {
128-
// goto -> bb2;
101+
// goto -> bb15;
129102
// }
130-
// bb26: {
103+
// bb17: {
131104
// _4 = ();
132105
// unreachable;
133106
// }
134-
// bb27: {
107+
// bb18: {
135108
// StorageDead(_4);
136109
// goto -> bb14;
137110
// }
138-
// bb28: {
111+
// bb19: {
139112
// StorageDead(_6);
140113
// _1 = ();
141114
// StorageDead(_2);
142115
// goto -> bb1;
143116
// }
144-
// bb29: {
117+
// bb20: {
145118
// return;
146119
// }
147120
// }

src/test/mir-opt/loop_test.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,15 @@ fn main() {
2828
// END RUST SOURCE
2929
// START rustc.main.SimplifyCfg-qualify-consts.after.mir
3030
// ...
31-
// bb1: { // The cleanup block
32-
// resume;
33-
// }
34-
// ...
35-
// bb3: { // Entry into the loop
31+
// bb2: { // Entry into the loop
3632
// _1 = ();
3733
// goto -> bb4;
3834
// }
35+
// bb3: { // The cleanup block
36+
// resume;
37+
// }
3938
// bb4: { // The loop_block
40-
// falseUnwind -> [real: bb5, cleanup: bb1];
39+
// falseUnwind -> [real: bb5, cleanup: bb3];
4140
// }
4241
// bb5: { // The loop body (body_block)
4342
// StorageLive(_5);

src/test/mir-opt/match_false_edges.rs

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -57,47 +57,47 @@ fn main() {
5757
// _7 = discriminant(_2);
5858
// _9 = &shallow (promoted[2]: std::option::Option<i32>);
5959
// _10 = &(((promoted[1]: std::option::Option<i32>) as Some).0: i32);
60-
// switchInt(move _7) -> [0isize: bb5, 1isize: bb3, otherwise: bb7];
60+
// switchInt(move _7) -> [0isize: bb4, 1isize: bb2, otherwise: bb6];
6161
// }
62-
// bb1: {
63-
// resume;
64-
// }
65-
// bb2: { // arm1
62+
// bb1: { // arm1
6663
// _1 = (const 3i32, const 3i32);
6764
// goto -> bb13;
6865
// }
69-
// bb3: { // binding3(empty) and arm3
66+
// bb2: { // binding3(empty) and arm3
7067
// FakeRead(ForMatchGuard, _9);
7168
// FakeRead(ForMatchGuard, _10);
72-
// falseEdges -> [real: bb8, imaginary: bb4]; //pre_binding1
69+
// falseEdges -> [real: bb7, imaginary: bb3]; //pre_binding1
7370
// }
74-
// bb4: {
71+
// bb3: {
7572
// FakeRead(ForMatchGuard, _9);
7673
// FakeRead(ForMatchGuard, _10);
77-
// falseEdges -> [real: bb12, imaginary: bb5]; //pre_binding2
74+
// falseEdges -> [real: bb12, imaginary: bb4]; //pre_binding2
7875
// }
79-
// bb5: {
76+
// bb4: {
8077
// FakeRead(ForMatchGuard, _9);
8178
// FakeRead(ForMatchGuard, _10);
82-
// falseEdges -> [real: bb2, imaginary: bb6]; //pre_binding3
79+
// falseEdges -> [real: bb1, imaginary: bb5]; //pre_binding3
8380
// }
84-
// bb6: {
81+
// bb5: {
8582
// unreachable;
8683
// }
87-
// bb7: {
84+
// bb6: {
8885
// unreachable;
8986
// }
90-
// bb8: { // binding1 and guard
87+
// bb7: { // binding1 and guard
9188
// StorageLive(_5);
9289
// _5 = &(((promoted[0]: std::option::Option<i32>) as Some).0: i32);
9390
// StorageLive(_8);
94-
// _8 = const guard() -> [return: bb9, unwind: bb1];
91+
// _8 = const guard() -> [return: bb8, unwind: bb9];
9592
// }
96-
// bb9: {
93+
// bb8: {
9794
// switchInt(move _8) -> [false: bb10, otherwise: bb11];
9895
// }
96+
// bb9: {
97+
// resume;
98+
// }
9999
// bb10: { // to pre_binding2
100-
// falseEdges -> [real: bb4, imaginary: bb4];
100+
// falseEdges -> [real: bb3, imaginary: bb3];
101101
// }
102102
// bb11: { // bindingNoLandingPads.before.mir2 and arm2
103103
// StorageLive(_3);
@@ -131,47 +131,47 @@ fn main() {
131131
// _7 = discriminant(_2);
132132
// _9 = &shallow _2;
133133
// _10 = &((_2 as Some).0: i32);
134-
// switchInt(move _7) -> [0isize: bb4, 1isize: bb3, otherwise: bb7];
134+
// switchInt(move _7) -> [0isize: bb3, 1isize: bb2, otherwise: bb6];
135135
// }
136-
// bb1: {
137-
// resume;
138-
// }
139-
// bb2: { // arm2
136+
// bb1: { // arm2
140137
// _1 = (const 3i32, const 3i32);
141138
// goto -> bb13;
142139
// }
143-
// bb3: {
140+
// bb2: {
144141
// FakeRead(ForMatchGuard, _9);
145142
// FakeRead(ForMatchGuard, _10);
146-
// falseEdges -> [real: bb8, imaginary: bb4]; //pre_binding1
143+
// falseEdges -> [real: bb7, imaginary: bb3]; //pre_binding1
147144
// }
148-
// bb4: {
145+
// bb3: {
149146
// FakeRead(ForMatchGuard, _9);
150147
// FakeRead(ForMatchGuard, _10);
151-
// falseEdges -> [real: bb2, imaginary: bb5]; //pre_binding2
148+
// falseEdges -> [real: bb1, imaginary: bb4]; //pre_binding2
152149
// }
153-
// bb5: {
150+
// bb4: {
154151
// FakeRead(ForMatchGuard, _9);
155152
// FakeRead(ForMatchGuard, _10);
156-
// falseEdges -> [real: bb12, imaginary: bb6]; //pre_binding3
153+
// falseEdges -> [real: bb12, imaginary: bb5]; //pre_binding3
157154
// }
158-
// bb6: {
155+
// bb5: {
159156
// unreachable;
160157
// }
161-
// bb7: {
158+
// bb6: {
162159
// unreachable;
163160
// }
164-
// bb8: { // binding1 and guard
161+
// bb7: { // binding1 and guard
165162
// StorageLive(_5);
166163
// _5 = &((_2 as Some).0: i32);
167164
// StorageLive(_8);
168-
// _8 = const guard() -> [return: bb9, unwind: bb1];
165+
// _8 = const guard() -> [return: bb8, unwind: bb9];
169166
// }
170-
// bb9: { // end of guard
167+
// bb8: { // end of guard
171168
// switchInt(move _8) -> [false: bb10, otherwise: bb11];
172169
// }
170+
// bb9: {
171+
// resume;
172+
// }
173173
// bb10: { // to pre_binding3 (can skip 2 since this is `Some`)
174-
// falseEdges -> [real: bb5, imaginary: bb4];
174+
// falseEdges -> [real: bb4, imaginary: bb3];
175175
// }
176176
// bb11: { // arm1
177177
// StorageLive(_3);
@@ -205,45 +205,45 @@ fn main() {
205205
// _11 = discriminant(_2);
206206
// _16 = &shallow _2;
207207
// _17 = &((_2 as Some).0: i32);
208-
// switchInt(move _11) -> [1isize: bb2, otherwise: bb3];
208+
// switchInt(move _11) -> [1isize: bb1, otherwise: bb2];
209209
// }
210210
// bb1: {
211-
// resume;
211+
// FakeRead(ForMatchGuard, _16);
212+
// FakeRead(ForMatchGuard, _17);
213+
// falseEdges -> [real: bb6, imaginary: bb2]; //pre_binding1
212214
// }
213215
// bb2: {
214216
// FakeRead(ForMatchGuard, _16);
215217
// FakeRead(ForMatchGuard, _17);
216-
// falseEdges -> [real: bb7, imaginary: bb3]; //pre_binding1
218+
// falseEdges -> [real: bb11, imaginary: bb3]; //pre_binding2
217219
// }
218220
// bb3: {
219221
// FakeRead(ForMatchGuard, _16);
220222
// FakeRead(ForMatchGuard, _17);
221-
// falseEdges -> [real: bb11, imaginary: bb4]; //pre_binding2
223+
// falseEdges -> [real: bb12, imaginary: bb4]; //pre_binding3
222224
// }
223225
// bb4: {
224226
// FakeRead(ForMatchGuard, _16);
225227
// FakeRead(ForMatchGuard, _17);
226-
// falseEdges -> [real: bb12, imaginary: bb5]; //pre_binding3
228+
// falseEdges -> [real: bb16, imaginary: bb5]; //pre_binding4
227229
// }
228230
// bb5: {
229-
// FakeRead(ForMatchGuard, _16);
230-
// FakeRead(ForMatchGuard, _17);
231-
// falseEdges -> [real: bb16, imaginary: bb6]; //pre_binding4
232-
// }
233-
// bb6: {
234231
// unreachable;
235232
// }
236-
// bb7: { // binding1: Some(w) if guard()
233+
// bb6: { // binding1: Some(w) if guard()
237234
// StorageLive(_5);
238235
// _5 = &((_2 as Some).0: i32);
239236
// StorageLive(_12);
240-
// _12 = const guard() -> [return: bb8, unwind: bb1];
237+
// _12 = const guard() -> [return: bb7, unwind: bb8];
241238
// }
242-
// bb8: { //end of guard
239+
// bb7: { //end of guard
243240
// switchInt(move _12) -> [false: bb9, otherwise: bb10];
244241
// }
242+
// bb8: {
243+
// resume;
244+
// }
245245
// bb9: { // to pre_binding2
246-
// falseEdges -> [real: bb3, imaginary: bb3];
246+
// falseEdges -> [real: bb2, imaginary: bb2];
247247
// }
248248
// bb10: { // set up bindings for arm1
249249
// StorageLive(_3);
@@ -263,14 +263,14 @@ fn main() {
263263
// StorageLive(_14);
264264
// StorageLive(_15);
265265
// _15 = (*_9);
266-
// _14 = const guard2(move _15) -> [return: bb13, unwind: bb1];
266+
// _14 = const guard2(move _15) -> [return: bb13, unwind: bb8];
267267
// }
268268
// bb13: { // end of guard2
269269
// StorageDead(_15);
270270
// switchInt(move _14) -> [false: bb14, otherwise: bb15];
271271
// }
272272
// bb14: { // to pre_binding4
273-
// falseEdges -> [real: bb5, imaginary: bb5];
273+
// falseEdges -> [real: bb4, imaginary: bb4];
274274
// }
275275
// bb15: { // set up bindings for arm3
276276
// StorageLive(_7);

0 commit comments

Comments
 (0)