Skip to content

Commit 5ffc919

Browse files
committed
Move the exit block of the match to the end
1 parent 90f40cd commit 5ffc919

File tree

5 files changed

+130
-126
lines changed

5 files changed

+130
-126
lines changed

src/librustc_mir/build/matches/mod.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,8 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
250250

251251
// Step 5. Create everything else: the guards and the arms.
252252

253-
// all the arm blocks will rejoin here
254-
let end_block = self.cfg.start_new_block();
255-
256253
let outer_source_info = self.source_info(span);
257-
258-
for (arm, candidates) in arm_candidates {
254+
let arm_end_blocks: Vec<_> = arm_candidates.into_iter().map(|(arm, candidates)| {
259255
let mut arm_block = self.cfg.start_new_block();
260256

261257
let body = self.hir.mirror(arm.body.clone());
@@ -283,6 +279,14 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
283279
}
284280

285281
unpack!(arm_block = self.into(destination, arm_block, body));
282+
283+
arm_block
284+
}).collect();
285+
286+
// all the arm blocks will rejoin here
287+
let end_block = self.cfg.start_new_block();
288+
289+
for arm_block in arm_end_blocks {
286290
self.cfg.terminate(
287291
arm_block,
288292
outer_source_info,

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

+19-19
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ fn main() {
4747
// resume;
4848
// }
4949
// bb5: {
50-
// falseEdges -> [real: bb12, imaginary: bb6];
50+
// falseEdges -> [real: bb11, imaginary: bb6];
5151
// }
5252
// bb6: {
53-
// falseEdges -> [real: bb14, imaginary: bb7];
53+
// falseEdges -> [real: bb13, imaginary: bb7];
5454
// }
5555
// bb7: {
5656
// unreachable;
@@ -62,41 +62,41 @@ fn main() {
6262
// goto -> bb5;
6363
// }
6464
// bb10: {
65-
// FakeRead(ForLet, _2);
66-
// StorageDead(_3);
67-
// StorageLive(_6);
68-
// _6 = &_2;
69-
// _5 = const std::mem::drop(move _6) -> [return: bb19, unwind: bb4];
65+
// _2 = const 4i32;
66+
// goto -> bb18;
7067
// }
7168
// bb11: {
72-
// _2 = const 4i32;
7369
// goto -> bb10;
7470
// }
7571
// bb12: {
76-
// goto -> bb11;
72+
// _0 = ();
73+
// goto -> bb14;
7774
// }
7875
// bb13: {
79-
// _0 = ();
80-
// goto -> bb15;
76+
// goto -> bb12;
8177
// }
8278
// bb14: {
83-
// goto -> bb13;
84-
// }
85-
// bb15: {
8679
// StorageDead(_3);
87-
// goto -> bb16;
80+
// goto -> bb15;
8881
// }
89-
// bb16: {
82+
// bb15: {
9083
// StorageDead(_2);
9184
// goto -> bb2;
9285
// }
93-
// bb17: {
86+
// bb16: {
9487
// _4 = ();
9588
// unreachable;
9689
// }
97-
// bb18: {
90+
// bb17: {
9891
// StorageDead(_4);
99-
// goto -> bb10;
92+
// goto -> bb18;
93+
// }
94+
// bb18: {
95+
// FakeRead(ForLet, _2);
96+
// StorageDead(_3);
97+
// StorageLive(_6);
98+
// _6 = &_2;
99+
// _5 = const std::mem::drop(move _6) -> [return: bb19, unwind: bb4];
100100
// }
101101
// bb19: {
102102
// StorageDead(_6);

src/test/mir-opt/match_false_edges.rs

+60-60
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ fn main() {
5151
// resume;
5252
// }
5353
// bb2: {
54-
// falseEdges -> [real: bb9, imaginary: bb3]; //pre_binding1
54+
// falseEdges -> [real: bb8, imaginary: bb3]; //pre_binding1
5555
// }
5656
// bb3: {
57-
// falseEdges -> [real: bb12, imaginary: bb4]; //pre_binding2
57+
// falseEdges -> [real: bb11, imaginary: bb4]; //pre_binding2
5858
// }
5959
// bb4: {
60-
// falseEdges -> [real: bb13, imaginary: bb5]; //pre_binding3
60+
// falseEdges -> [real: bb12, imaginary: bb5]; //pre_binding3
6161
// }
6262
// bb5: {
6363
// unreachable;
@@ -68,43 +68,43 @@ fn main() {
6868
// bb7: {
6969
// unreachable;
7070
// }
71-
// bb8: {
72-
// ...
73-
// return;
74-
// }
75-
// bb9: { // binding1 and guard
71+
// bb8: { // binding1 and guard
7672
// StorageLive(_6);
7773
// _6 = &(((promoted[1]: std::option::Option<i32>) as Some).0: i32);
7874
// _4 = &shallow (promoted[0]: std::option::Option<i32>);
7975
// StorageLive(_7);
80-
// _7 = const guard() -> [return: bb10, unwind: bb1];
76+
// _7 = const guard() -> [return: bb9, unwind: bb1];
8177
// }
82-
// bb10: {
78+
// bb9: {
8379
// FakeRead(ForMatchGuard, _4);
8480
// FakeRead(ForGuardBinding, _6);
85-
// switchInt(move _7) -> [false: bb6, otherwise: bb11];
81+
// switchInt(move _7) -> [false: bb6, otherwise: bb10];
8682
// }
87-
// bb11: {
83+
// bb10: {
8884
// StorageLive(_5);
8985
// _5 = ((_2 as Some).0: i32);
9086
// StorageLive(_8);
9187
// _8 = _5;
9288
// _1 = (const 1i32, move _8);
9389
// StorageDead(_8);
94-
// goto -> bb8;
90+
// goto -> bb13;
9591
// }
96-
// bb12: {
92+
// bb11: {
9793
// StorageLive(_9);
9894
// _9 = ((_2 as Some).0: i32);
9995
// StorageLive(_10);
10096
// _10 = _9;
10197
// _1 = (const 2i32, move _10);
10298
// StorageDead(_10);
103-
// goto -> bb8;
99+
// goto -> bb13;
104100
// }
105-
// bb13: {
101+
// bb12: {
106102
// _1 = (const 3i32, const 3i32);
107-
// goto -> bb8;
103+
// goto -> bb13;
104+
// }
105+
// bb13: {
106+
// ...
107+
// return;
108108
// }
109109
// END rustc.full_tested_match.QualifyAndPromoteConstants.after.mir
110110
//
@@ -120,13 +120,13 @@ fn main() {
120120
// resume;
121121
// }
122122
// bb2: {
123-
// falseEdges -> [real: bb9, imaginary: bb3];
123+
// falseEdges -> [real: bb8, imaginary: bb3];
124124
// }
125125
// bb3: {
126-
// falseEdges -> [real: bb12, imaginary: bb4];
126+
// falseEdges -> [real: bb11, imaginary: bb4];
127127
// }
128128
// bb4: {
129-
// falseEdges -> [real: bb13, imaginary: bb5];
129+
// falseEdges -> [real: bb12, imaginary: bb5];
130130
// }
131131
// bb5: {
132132
// unreachable;
@@ -137,43 +137,43 @@ fn main() {
137137
// bb7: {
138138
// unreachable;
139139
// }
140-
// bb8: {
141-
// ...
142-
// return;
143-
// }
144-
// bb9: { // binding1 and guard
140+
// bb8: { // binding1 and guard
145141
// StorageLive(_6);
146142
// _6 = &((_2 as Some).0: i32);
147143
// _4 = &shallow _2;
148144
// StorageLive(_7);
149-
// _7 = const guard() -> [return: bb10, unwind: bb1];
145+
// _7 = const guard() -> [return: bb9, unwind: bb1];
150146
// }
151-
// bb10: { // end of guard
147+
// bb9: { // end of guard
152148
// FakeRead(ForMatchGuard, _4);
153149
// FakeRead(ForGuardBinding, _6);
154-
// switchInt(move _7) -> [false: bb6, otherwise: bb11];
150+
// switchInt(move _7) -> [false: bb6, otherwise: bb10];
155151
// }
156-
// bb11: { // arm1
152+
// bb10: { // arm1
157153
// StorageLive(_5);
158154
// _5 = ((_2 as Some).0: i32);
159155
// StorageLive(_8);
160156
// _8 = _5;
161157
// _1 = (const 1i32, move _8);
162158
// StorageDead(_8);
163-
// goto -> bb8;
159+
// goto -> bb13;
164160
// }
165-
// bb12: { // arm2
161+
// bb11: { // arm2
166162
// _1 = (const 3i32, const 3i32);
167-
// goto -> bb8;
163+
// goto -> bb13;
168164
// }
169-
// bb13: { // binding3 and arm3
165+
// bb12: { // binding3 and arm3
170166
// StorageLive(_9);
171167
// _9 = ((_2 as Some).0: i32);
172168
// StorageLive(_10);
173169
// _10 = _9;
174170
// _1 = (const 2i32, move _10);
175171
// StorageDead(_10);
176-
// goto -> bb8;
172+
// goto -> bb13;
173+
// }
174+
// bb13: {
175+
// ...
176+
// return;
177177
// }
178178
// END rustc.full_tested_match2.QualifyAndPromoteConstants.before.mir
179179
//
@@ -189,79 +189,79 @@ fn main() {
189189
// resume;
190190
// }
191191
// bb2: {
192-
// falseEdges -> [real: bb10, imaginary: bb3]; //pre_binding1
192+
// falseEdges -> [real: bb9, imaginary: bb3];
193193
// }
194194
// bb3: {
195-
// falseEdges -> [real: bb13, imaginary: bb4]; //pre_binding2
195+
// falseEdges -> [real: bb12, imaginary: bb4];
196196
// }
197197
// bb4: {
198-
// falseEdges -> [real: bb14, imaginary: bb5]; //pre_binding3
198+
// falseEdges -> [real: bb13, imaginary: bb5];
199199
// }
200200
// bb5: {
201-
// falseEdges -> [real: bb17, imaginary: bb6]; //pre_binding4
201+
// falseEdges -> [real: bb16, imaginary: bb6];
202202
// }
203203
// bb6: {
204204
// unreachable;
205205
// }
206-
// bb7: { // to pre_binding2
206+
// bb7: {
207207
// falseEdges -> [real: bb3, imaginary: bb3];
208208
// }
209-
// bb8: { // to pre_binding4
209+
// bb8: {
210210
// falseEdges -> [real: bb5, imaginary: bb5];
211211
// }
212-
// bb9: {
213-
// ...
214-
// return;
215-
// }
216-
// bb10: { // binding1: Some(w) if guard()
212+
// bb9: { // binding1: Some(w) if guard()
217213
// StorageLive(_7);
218214
// _7 = &((_2 as Some).0: i32);
219215
// _5 = &shallow _2;
220216
// StorageLive(_8);
221-
// _8 = const guard() -> [return: bb11, unwind: bb1];
217+
// _8 = const guard() -> [return: bb10, unwind: bb1];
222218
// }
223-
// bb11: { //end of guard
219+
// bb10: { //end of guard
224220
// FakeRead(ForMatchGuard, _5);
225221
// FakeRead(ForGuardBinding, _7);
226-
// switchInt(move _8) -> [false: bb7, otherwise: bb12];
222+
// switchInt(move _8) -> [false: bb7, otherwise: bb11];
227223
// }
228-
// bb12: { // set up bindings for arm1
224+
// bb11: { // set up bindings for arm1
229225
// StorageLive(_6);
230226
// _6 = ((_2 as Some).0: i32);
231227
// _1 = const 1i32;
232-
// goto -> bb9;
228+
// goto -> bb17;
233229
// }
234-
// bb13: { // binding2 & arm2
230+
// bb12: { // binding2 & arm2
235231
// StorageLive(_9);
236232
// _9 = _2;
237233
// _1 = const 2i32;
238-
// goto -> bb9;
234+
// goto -> bb17;
239235
// }
240-
// bb14: { // binding3: Some(y) if guard2(y)
236+
// bb13: { // binding3: Some(y) if guard2(y)
241237
// StorageLive(_11);
242238
// _11 = &((_2 as Some).0: i32);
243239
// _5 = &shallow _2;
244240
// StorageLive(_12);
245241
// StorageLive(_13);
246242
// _13 = (*_11);
247-
// _12 = const guard2(move _13) -> [return: bb15, unwind: bb1];
243+
// _12 = const guard2(move _13) -> [return: bb14, unwind: bb1];
248244
// }
249-
// bb15: { // end of guard2
245+
// bb14: { // end of guard2
250246
// StorageDead(_13);
251247
// FakeRead(ForMatchGuard, _5);
252248
// FakeRead(ForGuardBinding, _11);
253-
// switchInt(move _12) -> [false: bb8, otherwise: bb16];
249+
// switchInt(move _12) -> [false: bb8, otherwise: bb15];
254250
// }
255-
// bb16: { // binding4 & arm4
251+
// bb15: { // binding4 & arm4
256252
// StorageLive(_10);
257253
// _10 = ((_2 as Some).0: i32);
258254
// _1 = const 3i32;
259-
// goto -> bb9;
255+
// goto -> bb17;
260256
// }
261-
// bb17: {
257+
// bb16: {
262258
// StorageLive(_14);
263259
// _14 = _2;
264260
// _1 = const 4i32;
265-
// goto -> bb9;
261+
// goto -> bb17;
262+
// }
263+
// bb17: {
264+
// ...
265+
// return;
266266
// }
267267
// END rustc.main.QualifyAndPromoteConstants.before.mir

0 commit comments

Comments
 (0)