Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 63555ae

Browse files
committedMay 4, 2024·
Enable DestinationPropagation by default.
1 parent 1a851da commit 63555ae

21 files changed

+373
-660
lines changed
 

‎compiler/rustc_mir_transform/src/dest_prop.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ impl<'tcx> MirPass<'tcx> for DestinationPropagation {
159159
// 2. Despite being an overall perf improvement, this still causes a 30% regression in
160160
// keccak. We can temporarily fix this by bounding function size, but in the long term
161161
// we should fix this by being smarter about invalidating analysis results.
162-
sess.mir_opt_level() >= 3
162+
sess.mir_opt_level() >= 2
163163
}
164164

165165
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {

‎compiler/rustc_mir_transform/src/lib.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ mod match_branches;
8989
mod mentioned_items;
9090
mod multiple_return_terminators;
9191
mod normalize_array_len;
92-
mod nrvo;
9392
mod prettify;
9493
mod promote_consts;
9594
mod ref_prop;
@@ -599,13 +598,12 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
599598
&jump_threading::JumpThreading,
600599
&early_otherwise_branch::EarlyOtherwiseBranch,
601600
&simplify_comparison_integral::SimplifyComparisonIntegral,
602-
&dest_prop::DestinationPropagation,
603601
&o1(simplify_branches::SimplifyConstCondition::Final),
604602
&o1(remove_noop_landing_pads::RemoveNoopLandingPads),
605603
&o1(simplify::SimplifyCfg::Final),
606604
&copy_prop::CopyProp,
607605
&dead_store_elimination::DeadStoreElimination::Final,
608-
&nrvo::RenameReturnPlace,
606+
&dest_prop::DestinationPropagation,
609607
&simplify::SimplifyLocals::Final,
610608
&multiple_return_terminators::MultipleReturnTerminators,
611609
&deduplicate_blocks::DeduplicateBlocks,

‎compiler/rustc_mir_transform/src/nrvo.rs

Lines changed: 0 additions & 234 deletions
This file was deleted.

‎tests/mir-opt/nrvo_simple.nrvo.RenameReturnPlace.panic-abort.diff renamed to ‎tests/mir-opt/dest-prop/nrvo_borrowed.nrvo.DestinationPropagation.panic-abort.diff

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
- // MIR for `nrvo` before RenameReturnPlace
2-
+ // MIR for `nrvo` after RenameReturnPlace
1+
- // MIR for `nrvo` before DestinationPropagation
2+
+ // MIR for `nrvo` after DestinationPropagation
33

44
fn nrvo(_1: for<'a> fn(&'a mut [u8; 1024])) -> [u8; 1024] {
55
debug init => _1;
@@ -10,32 +10,33 @@
1010
let mut _5: &mut [u8; 1024];
1111
let mut _6: &mut [u8; 1024];
1212
scope 1 {
13-
- debug buf => _2;
14-
+ debug buf => _0;
13+
debug buf => _2;
1514
}
1615

1716
bb0: {
18-
- StorageLive(_2);
19-
- _2 = [const 0_u8; 1024];
20-
+ _0 = [const 0_u8; 1024];
17+
StorageLive(_2);
18+
_2 = [const 0_u8; 1024];
2119
StorageLive(_3);
22-
StorageLive(_4);
23-
_4 = _1;
20+
- StorageLive(_4);
21+
- _4 = _1;
22+
+ nop;
23+
+ nop;
2424
StorageLive(_5);
2525
StorageLive(_6);
26-
- _6 = &mut _2;
27-
+ _6 = &mut _0;
26+
_6 = &mut _2;
2827
_5 = &mut (*_6);
29-
_3 = move _4(move _5) -> [return: bb1, unwind unreachable];
28+
- _3 = move _4(move _5) -> [return: bb1, unwind unreachable];
29+
+ _3 = move _1(move _5) -> [return: bb1, unwind unreachable];
3030
}
3131

3232
bb1: {
3333
StorageDead(_5);
34-
StorageDead(_4);
34+
- StorageDead(_4);
35+
+ nop;
3536
StorageDead(_6);
3637
StorageDead(_3);
37-
- _0 = _2;
38-
- StorageDead(_2);
38+
_0 = _2;
39+
StorageDead(_2);
3940
return;
4041
}
4142
}

‎tests/mir-opt/nrvo_simple.nrvo.RenameReturnPlace.panic-unwind.diff renamed to ‎tests/mir-opt/dest-prop/nrvo_borrowed.nrvo.DestinationPropagation.panic-unwind.diff

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
- // MIR for `nrvo` before RenameReturnPlace
2-
+ // MIR for `nrvo` after RenameReturnPlace
1+
- // MIR for `nrvo` before DestinationPropagation
2+
+ // MIR for `nrvo` after DestinationPropagation
33

44
fn nrvo(_1: for<'a> fn(&'a mut [u8; 1024])) -> [u8; 1024] {
55
debug init => _1;
@@ -10,32 +10,33 @@
1010
let mut _5: &mut [u8; 1024];
1111
let mut _6: &mut [u8; 1024];
1212
scope 1 {
13-
- debug buf => _2;
14-
+ debug buf => _0;
13+
debug buf => _2;
1514
}
1615

1716
bb0: {
18-
- StorageLive(_2);
19-
- _2 = [const 0_u8; 1024];
20-
+ _0 = [const 0_u8; 1024];
17+
StorageLive(_2);
18+
_2 = [const 0_u8; 1024];
2119
StorageLive(_3);
22-
StorageLive(_4);
23-
_4 = _1;
20+
- StorageLive(_4);
21+
- _4 = _1;
22+
+ nop;
23+
+ nop;
2424
StorageLive(_5);
2525
StorageLive(_6);
26-
- _6 = &mut _2;
27-
+ _6 = &mut _0;
26+
_6 = &mut _2;
2827
_5 = &mut (*_6);
29-
_3 = move _4(move _5) -> [return: bb1, unwind continue];
28+
- _3 = move _4(move _5) -> [return: bb1, unwind continue];
29+
+ _3 = move _1(move _5) -> [return: bb1, unwind continue];
3030
}
3131

3232
bb1: {
3333
StorageDead(_5);
34-
StorageDead(_4);
34+
- StorageDead(_4);
35+
+ nop;
3536
StorageDead(_6);
3637
StorageDead(_3);
37-
- _0 = _2;
38-
- StorageDead(_2);
38+
_0 = _2;
39+
StorageDead(_2);
3940
return;
4041
}
4142
}

‎tests/mir-opt/nrvo_simple.rs renamed to ‎tests/mir-opt/dest-prop/nrvo_borrowed.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// skip-filecheck
22
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
3-
//@ test-mir-pass: RenameReturnPlace
3+
//@ test-mir-pass: DestinationPropagation
44

5-
// EMIT_MIR nrvo_simple.nrvo.RenameReturnPlace.diff
5+
// EMIT_MIR nrvo_borrowed.nrvo.DestinationPropagation.diff
66
fn nrvo(init: fn(&mut [u8; 1024])) -> [u8; 1024] {
77
let mut buf = [0; 1024];
88
init(&mut buf);

‎tests/mir-opt/nrvo_miscompile_111005.rs renamed to ‎tests/mir-opt/dest-prop/nrvo_miscompile_111005.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// skip-filecheck
22
// This is a miscompilation, #111005 to track
33

4-
//@ test-mir-pass: RenameReturnPlace
4+
//@ test-mir-pass: DestinationPropagation
55

66
#![feature(custom_mir, core_intrinsics)]
77
extern crate core;
88
use core::intrinsics::mir::*;
99

10-
// EMIT_MIR nrvo_miscompile_111005.wrong.RenameReturnPlace.diff
10+
// EMIT_MIR nrvo_miscompile_111005.wrong.DestinationPropagation.diff
1111
#[custom_mir(dialect = "runtime", phase = "initial")]
1212
pub fn wrong(arg: char) -> char {
1313
mir!({

‎tests/mir-opt/nrvo_miscompile_111005.wrong.RenameReturnPlace.diff renamed to ‎tests/mir-opt/dest-prop/nrvo_miscompile_111005.wrong.DestinationPropagation.diff

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
- // MIR for `wrong` before RenameReturnPlace
2-
+ // MIR for `wrong` after RenameReturnPlace
1+
- // MIR for `wrong` before DestinationPropagation
2+
+ // MIR for `wrong` after DestinationPropagation
33

44
fn wrong(_1: char) -> char {
55
let mut _0: char;
@@ -9,8 +9,9 @@
99
- _2 = _1;
1010
- _0 = _2;
1111
- _2 = const 'b';
12+
+ nop;
1213
+ _0 = _1;
13-
+ _0 = const 'b';
14+
+ _1 = const 'b';
1415
return;
1516
}
1617
}

‎tests/mir-opt/dest-prop/union.main.DestinationPropagation.panic-abort.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
bb0: {
1919
StorageLive(_1);
2020
StorageLive(_2);
21-
_2 = const 1_u32;
21+
nop;
2222
_1 = Un { us: const 1_u32 };
2323
StorageDead(_2);
2424
StorageLive(_3);

‎tests/mir-opt/dest-prop/union.main.DestinationPropagation.panic-unwind.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
bb0: {
1919
StorageLive(_1);
2020
StorageLive(_2);
21-
_2 = const 1_u32;
21+
nop;
2222
_1 = Un { us: const 1_u32 };
2323
StorageDead(_2);
2424
StorageLive(_3);

‎tests/mir-opt/pre-codegen/derived_ord.{impl#0}-partial_cmp.PreCodegen.after.mir

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@ fn <impl at $DIR/derived_ord.rs:6:10: 6:20>::partial_cmp(_1: &MultiField, _2: &M
44
debug self => _1;
55
debug other => _2;
66
let mut _0: std::option::Option<std::cmp::Ordering>;
7-
let mut _6: std::option::Option<std::cmp::Ordering>;
8-
let mut _7: i8;
7+
let mut _6: i8;
98
scope 1 {
10-
debug cmp => _6;
9+
debug cmp => _0;
1110
}
1211
scope 2 (inlined std::cmp::impls::<impl PartialOrd for char>::partial_cmp) {
1312
let mut _3: char;
1413
let mut _4: char;
1514
let mut _5: std::cmp::Ordering;
1615
}
1716
scope 3 (inlined std::cmp::impls::<impl PartialOrd for i16>::partial_cmp) {
17+
let mut _7: i16;
1818
let mut _8: i16;
19-
let mut _9: i16;
20-
let mut _10: std::cmp::Ordering;
19+
let mut _9: std::cmp::Ordering;
2120
}
2221

2322
bb0: {
@@ -28,27 +27,26 @@ fn <impl at $DIR/derived_ord.rs:6:10: 6:20>::partial_cmp(_1: &MultiField, _2: &M
2827
_5 = Cmp(move _3, move _4);
2928
StorageDead(_4);
3029
StorageDead(_3);
31-
_6 = Option::<std::cmp::Ordering>::Some(_5);
32-
_7 = discriminant(_5);
33-
switchInt(move _7) -> [0: bb1, otherwise: bb2];
30+
_0 = Option::<std::cmp::Ordering>::Some(_5);
31+
_6 = discriminant(_5);
32+
switchInt(move _6) -> [0: bb1, otherwise: bb2];
3433
}
3534

3635
bb1: {
37-
StorageLive(_10);
38-
StorageLive(_8);
39-
_8 = ((*_1).1: i16);
4036
StorageLive(_9);
41-
_9 = ((*_2).1: i16);
42-
_10 = Cmp(move _8, move _9);
43-
StorageDead(_9);
37+
StorageLive(_7);
38+
_7 = ((*_1).1: i16);
39+
StorageLive(_8);
40+
_8 = ((*_2).1: i16);
41+
_9 = Cmp(move _7, move _8);
4442
StorageDead(_8);
45-
_0 = Option::<std::cmp::Ordering>::Some(move _10);
46-
StorageDead(_10);
43+
StorageDead(_7);
44+
_0 = Option::<std::cmp::Ordering>::Some(move _9);
45+
StorageDead(_9);
4746
goto -> bb3;
4847
}
4948

5049
bb2: {
51-
_0 = _6;
5250
goto -> bb3;
5351
}
5452

‎tests/mir-opt/pre-codegen/range_iter.forward_loop.PreCodegen.after.panic-abort.mir

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,25 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
55
debug end => _2;
66
debug f => _3;
77
let mut _0: ();
8-
let mut _4: u32;
9-
let mut _9: std::option::Option<u32>;
10-
let mut _11: &impl Fn(u32);
11-
let mut _12: (u32,);
12-
let _13: ();
8+
let mut _7: std::option::Option<u32>;
9+
let mut _9: &impl Fn(u32);
10+
let mut _10: (u32,);
11+
let _11: ();
1312
scope 1 {
14-
debug ((iter: std::ops::Range<u32>).0: u32) => _4;
13+
debug ((iter: std::ops::Range<u32>).0: u32) => _1;
1514
debug ((iter: std::ops::Range<u32>).1: u32) => _2;
16-
let _10: u32;
15+
let _8: u32;
1716
scope 2 {
18-
debug x => _10;
17+
debug x => _8;
1918
}
2019
scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<u32>>::next) {
2120
scope 5 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) {
22-
let mut _6: bool;
23-
let _7: u32;
24-
let mut _8: u32;
21+
let mut _5: bool;
22+
let _6: u32;
2523
scope 6 {
2624
}
2725
scope 7 (inlined std::cmp::impls::<impl PartialOrd for u32>::lt) {
28-
let mut _5: u32;
26+
let mut _4: u32;
2927
}
3028
}
3129
}
@@ -34,27 +32,24 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
3432
}
3533

3634
bb0: {
37-
StorageLive(_4);
38-
_4 = _1;
3935
goto -> bb1;
4036
}
4137

4238
bb1: {
43-
StorageLive(_9);
4439
StorageLive(_7);
4540
StorageLive(_6);
4641
StorageLive(_5);
47-
_5 = _4;
48-
_6 = Lt(move _5, _2);
49-
StorageDead(_5);
50-
switchInt(move _6) -> [0: bb2, otherwise: bb4];
42+
StorageLive(_4);
43+
_4 = _1;
44+
_5 = Lt(move _4, _2);
45+
StorageDead(_4);
46+
switchInt(move _5) -> [0: bb2, otherwise: bb4];
5147
}
5248

5349
bb2: {
50+
StorageDead(_5);
5451
StorageDead(_6);
5552
StorageDead(_7);
56-
StorageDead(_9);
57-
StorageDead(_4);
5853
drop(_3) -> [return: bb3, unwind unreachable];
5954
}
6055

@@ -63,29 +58,26 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
6358
}
6459

6560
bb4: {
66-
_7 = _4;
67-
StorageLive(_8);
68-
_8 = <u32 as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb5, unwind unreachable];
61+
_6 = _1;
62+
_1 = <u32 as Step>::forward_unchecked(_6, const 1_usize) -> [return: bb5, unwind unreachable];
6963
}
7064

7165
bb5: {
72-
_4 = move _8;
73-
StorageDead(_8);
74-
_9 = Option::<u32>::Some(_7);
66+
_7 = Option::<u32>::Some(_6);
67+
StorageDead(_5);
7568
StorageDead(_6);
76-
StorageDead(_7);
77-
_10 = ((_9 as Some).0: u32);
78-
StorageLive(_11);
79-
_11 = &_3;
80-
StorageLive(_12);
81-
_12 = (_10,);
82-
_13 = <impl Fn(u32) as Fn<(u32,)>>::call(move _11, move _12) -> [return: bb6, unwind unreachable];
69+
_8 = ((_7 as Some).0: u32);
70+
StorageLive(_9);
71+
_9 = &_3;
72+
StorageLive(_10);
73+
_10 = (_8,);
74+
_11 = <impl Fn(u32) as Fn<(u32,)>>::call(move _9, move _10) -> [return: bb6, unwind unreachable];
8375
}
8476

8577
bb6: {
86-
StorageDead(_12);
87-
StorageDead(_11);
78+
StorageDead(_10);
8879
StorageDead(_9);
80+
StorageDead(_7);
8981
goto -> bb1;
9082
}
9183
}

‎tests/mir-opt/pre-codegen/range_iter.forward_loop.PreCodegen.after.panic-unwind.mir

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,25 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
55
debug end => _2;
66
debug f => _3;
77
let mut _0: ();
8-
let mut _4: u32;
9-
let mut _9: std::option::Option<u32>;
10-
let mut _11: &impl Fn(u32);
11-
let mut _12: (u32,);
12-
let _13: ();
8+
let mut _7: std::option::Option<u32>;
9+
let mut _9: &impl Fn(u32);
10+
let mut _10: (u32,);
11+
let _11: ();
1312
scope 1 {
14-
debug ((iter: std::ops::Range<u32>).0: u32) => _4;
13+
debug ((iter: std::ops::Range<u32>).0: u32) => _1;
1514
debug ((iter: std::ops::Range<u32>).1: u32) => _2;
16-
let _10: u32;
15+
let _8: u32;
1716
scope 2 {
18-
debug x => _10;
17+
debug x => _8;
1918
}
2019
scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<u32>>::next) {
2120
scope 5 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) {
22-
let mut _6: bool;
23-
let _7: u32;
24-
let mut _8: u32;
21+
let mut _5: bool;
22+
let _6: u32;
2523
scope 6 {
2624
}
2725
scope 7 (inlined std::cmp::impls::<impl PartialOrd for u32>::lt) {
28-
let mut _5: u32;
26+
let mut _4: u32;
2927
}
3028
}
3129
}
@@ -34,27 +32,24 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
3432
}
3533

3634
bb0: {
37-
StorageLive(_4);
38-
_4 = _1;
3935
goto -> bb1;
4036
}
4137

4238
bb1: {
43-
StorageLive(_9);
4439
StorageLive(_7);
4540
StorageLive(_6);
4641
StorageLive(_5);
47-
_5 = _4;
48-
_6 = Lt(move _5, _2);
49-
StorageDead(_5);
50-
switchInt(move _6) -> [0: bb2, otherwise: bb4];
42+
StorageLive(_4);
43+
_4 = _1;
44+
_5 = Lt(move _4, _2);
45+
StorageDead(_4);
46+
switchInt(move _5) -> [0: bb2, otherwise: bb4];
5147
}
5248

5349
bb2: {
50+
StorageDead(_5);
5451
StorageDead(_6);
5552
StorageDead(_7);
56-
StorageDead(_9);
57-
StorageDead(_4);
5853
drop(_3) -> [return: bb3, unwind continue];
5954
}
6055

@@ -63,29 +58,26 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
6358
}
6459

6560
bb4: {
66-
_7 = _4;
67-
StorageLive(_8);
68-
_8 = <u32 as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb5, unwind: bb7];
61+
_6 = _1;
62+
_1 = <u32 as Step>::forward_unchecked(_6, const 1_usize) -> [return: bb5, unwind: bb7];
6963
}
7064

7165
bb5: {
72-
_4 = move _8;
73-
StorageDead(_8);
74-
_9 = Option::<u32>::Some(_7);
66+
_7 = Option::<u32>::Some(_6);
67+
StorageDead(_5);
7568
StorageDead(_6);
76-
StorageDead(_7);
77-
_10 = ((_9 as Some).0: u32);
78-
StorageLive(_11);
79-
_11 = &_3;
80-
StorageLive(_12);
81-
_12 = (_10,);
82-
_13 = <impl Fn(u32) as Fn<(u32,)>>::call(move _11, move _12) -> [return: bb6, unwind: bb7];
69+
_8 = ((_7 as Some).0: u32);
70+
StorageLive(_9);
71+
_9 = &_3;
72+
StorageLive(_10);
73+
_10 = (_8,);
74+
_11 = <impl Fn(u32) as Fn<(u32,)>>::call(move _9, move _10) -> [return: bb6, unwind: bb7];
8375
}
8476

8577
bb6: {
86-
StorageDead(_12);
87-
StorageDead(_11);
78+
StorageDead(_10);
8879
StorageDead(_9);
80+
StorageDead(_7);
8981
goto -> bb1;
9082
}
9183

‎tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-abort.mir

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
44
debug slice => _1;
55
debug f => _2;
66
let mut _0: ();
7-
let mut _12: std::slice::Iter<'_, T>;
7+
let mut _11: std::slice::Iter<'_, T>;
8+
let mut _12: std::iter::Enumerate<std::slice::Iter<'_, T>>;
89
let mut _13: std::iter::Enumerate<std::slice::Iter<'_, T>>;
9-
let mut _14: std::iter::Enumerate<std::slice::Iter<'_, T>>;
10-
let mut _15: &mut std::iter::Enumerate<std::slice::Iter<'_, T>>;
11-
let mut _16: std::option::Option<(usize, &T)>;
12-
let mut _17: isize;
13-
let mut _20: &impl Fn(usize, &T);
14-
let mut _21: (usize, &T);
15-
let _22: ();
10+
let mut _14: &mut std::iter::Enumerate<std::slice::Iter<'_, T>>;
11+
let mut _15: std::option::Option<(usize, &T)>;
12+
let mut _16: isize;
13+
let mut _19: &impl Fn(usize, &T);
14+
let mut _20: (usize, &T);
15+
let _21: ();
1616
scope 1 {
17-
debug iter => _14;
18-
let _18: usize;
19-
let _19: &T;
17+
debug iter => _13;
18+
let _17: usize;
19+
let _18: &T;
2020
scope 2 {
21-
debug i => _18;
22-
debug x => _19;
21+
debug i => _17;
22+
debug x => _18;
2323
}
2424
}
2525
scope 3 (inlined core::slice::<impl [T]>::iter) {
@@ -28,11 +28,10 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
2828
let mut _7: bool;
2929
let mut _8: *mut T;
3030
let mut _9: *mut T;
31-
let mut _11: *const T;
31+
let mut _10: *const T;
3232
scope 5 {
3333
let _6: std::ptr::NonNull<T>;
3434
scope 6 {
35-
let _10: *const T;
3635
scope 7 {
3736
}
3837
scope 11 (inlined without_provenance::<T>) {
@@ -61,16 +60,16 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
6160
}
6261

6362
bb0: {
64-
StorageLive(_12);
63+
StorageLive(_11);
6564
StorageLive(_3);
6665
StorageLive(_6);
66+
StorageLive(_10);
6767
StorageLive(_4);
6868
StorageLive(_5);
6969
_3 = Len((*_1));
7070
_4 = &raw const (*_1);
7171
_5 = _4 as *const T (PtrToPtr);
7272
_6 = NonNull::<T> { pointer: _5 };
73-
StorageLive(_10);
7473
StorageLive(_7);
7574
_7 = const <T as std::mem::SizedTypeProperties>::IS_ZST;
7675
switchInt(move _7) -> [0: bb1, otherwise: bb2];
@@ -94,38 +93,35 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
9493

9594
bb3: {
9695
StorageDead(_7);
97-
StorageLive(_11);
98-
_11 = _10;
99-
_12 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _11, _marker: const ZeroSized: PhantomData<&T> };
100-
StorageDead(_11);
101-
StorageDead(_10);
96+
_11 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _10, _marker: const ZeroSized: PhantomData<&T> };
10297
StorageDead(_5);
10398
StorageDead(_4);
99+
StorageDead(_10);
104100
StorageDead(_6);
105101
StorageDead(_3);
106-
_13 = Enumerate::<std::slice::Iter<'_, T>> { iter: _12, count: const 0_usize };
107-
StorageDead(_12);
108-
StorageLive(_14);
109-
_14 = _13;
102+
_12 = Enumerate::<std::slice::Iter<'_, T>> { iter: _11, count: const 0_usize };
103+
StorageDead(_11);
104+
StorageLive(_13);
105+
_13 = _12;
110106
goto -> bb4;
111107
}
112108

113109
bb4: {
114-
StorageLive(_16);
115110
StorageLive(_15);
116-
_15 = &mut _14;
117-
_16 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(move _15) -> [return: bb5, unwind unreachable];
111+
StorageLive(_14);
112+
_14 = &mut _13;
113+
_15 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(move _14) -> [return: bb5, unwind unreachable];
118114
}
119115

120116
bb5: {
121-
StorageDead(_15);
122-
_17 = discriminant(_16);
123-
switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10];
117+
StorageDead(_14);
118+
_16 = discriminant(_15);
119+
switchInt(move _16) -> [0: bb6, 1: bb8, otherwise: bb10];
124120
}
125121

126122
bb6: {
127-
StorageDead(_16);
128-
StorageDead(_14);
123+
StorageDead(_15);
124+
StorageDead(_13);
129125
drop(_2) -> [return: bb7, unwind unreachable];
130126
}
131127

@@ -134,19 +130,19 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
134130
}
135131

136132
bb8: {
137-
_18 = (((_16 as Some).0: (usize, &T)).0: usize);
138-
_19 = (((_16 as Some).0: (usize, &T)).1: &T);
133+
_17 = (((_15 as Some).0: (usize, &T)).0: usize);
134+
_18 = (((_15 as Some).0: (usize, &T)).1: &T);
135+
StorageLive(_19);
136+
_19 = &_2;
139137
StorageLive(_20);
140-
_20 = &_2;
141-
StorageLive(_21);
142-
_21 = (_18, _19);
143-
_22 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _20, move _21) -> [return: bb9, unwind unreachable];
138+
_20 = (_17, _18);
139+
_21 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _19, move _20) -> [return: bb9, unwind unreachable];
144140
}
145141

146142
bb9: {
147-
StorageDead(_21);
148143
StorageDead(_20);
149-
StorageDead(_16);
144+
StorageDead(_19);
145+
StorageDead(_15);
150146
goto -> bb4;
151147
}
152148

‎tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-unwind.mir

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
44
debug slice => _1;
55
debug f => _2;
66
let mut _0: ();
7-
let mut _12: std::slice::Iter<'_, T>;
7+
let mut _11: std::slice::Iter<'_, T>;
8+
let mut _12: std::iter::Enumerate<std::slice::Iter<'_, T>>;
89
let mut _13: std::iter::Enumerate<std::slice::Iter<'_, T>>;
9-
let mut _14: std::iter::Enumerate<std::slice::Iter<'_, T>>;
10-
let mut _15: &mut std::iter::Enumerate<std::slice::Iter<'_, T>>;
11-
let mut _16: std::option::Option<(usize, &T)>;
12-
let mut _17: isize;
13-
let mut _20: &impl Fn(usize, &T);
14-
let mut _21: (usize, &T);
15-
let _22: ();
10+
let mut _14: &mut std::iter::Enumerate<std::slice::Iter<'_, T>>;
11+
let mut _15: std::option::Option<(usize, &T)>;
12+
let mut _16: isize;
13+
let mut _19: &impl Fn(usize, &T);
14+
let mut _20: (usize, &T);
15+
let _21: ();
1616
scope 1 {
17-
debug iter => _14;
18-
let _18: usize;
19-
let _19: &T;
17+
debug iter => _13;
18+
let _17: usize;
19+
let _18: &T;
2020
scope 2 {
21-
debug i => _18;
22-
debug x => _19;
21+
debug i => _17;
22+
debug x => _18;
2323
}
2424
}
2525
scope 3 (inlined core::slice::<impl [T]>::iter) {
@@ -28,11 +28,10 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
2828
let mut _7: bool;
2929
let mut _8: *mut T;
3030
let mut _9: *mut T;
31-
let mut _11: *const T;
31+
let mut _10: *const T;
3232
scope 5 {
3333
let _6: std::ptr::NonNull<T>;
3434
scope 6 {
35-
let _10: *const T;
3635
scope 7 {
3736
}
3837
scope 11 (inlined without_provenance::<T>) {
@@ -61,16 +60,16 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
6160
}
6261

6362
bb0: {
64-
StorageLive(_12);
63+
StorageLive(_11);
6564
StorageLive(_3);
6665
StorageLive(_6);
66+
StorageLive(_10);
6767
StorageLive(_4);
6868
StorageLive(_5);
6969
_3 = Len((*_1));
7070
_4 = &raw const (*_1);
7171
_5 = _4 as *const T (PtrToPtr);
7272
_6 = NonNull::<T> { pointer: _5 };
73-
StorageLive(_10);
7473
StorageLive(_7);
7574
_7 = const <T as std::mem::SizedTypeProperties>::IS_ZST;
7675
switchInt(move _7) -> [0: bb1, otherwise: bb2];
@@ -94,38 +93,35 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
9493

9594
bb3: {
9695
StorageDead(_7);
97-
StorageLive(_11);
98-
_11 = _10;
99-
_12 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _11, _marker: const ZeroSized: PhantomData<&T> };
100-
StorageDead(_11);
101-
StorageDead(_10);
96+
_11 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _10, _marker: const ZeroSized: PhantomData<&T> };
10297
StorageDead(_5);
10398
StorageDead(_4);
99+
StorageDead(_10);
104100
StorageDead(_6);
105101
StorageDead(_3);
106-
_13 = Enumerate::<std::slice::Iter<'_, T>> { iter: _12, count: const 0_usize };
107-
StorageDead(_12);
108-
StorageLive(_14);
109-
_14 = _13;
102+
_12 = Enumerate::<std::slice::Iter<'_, T>> { iter: _11, count: const 0_usize };
103+
StorageDead(_11);
104+
StorageLive(_13);
105+
_13 = _12;
110106
goto -> bb4;
111107
}
112108

113109
bb4: {
114-
StorageLive(_16);
115110
StorageLive(_15);
116-
_15 = &mut _14;
117-
_16 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(move _15) -> [return: bb5, unwind: bb11];
111+
StorageLive(_14);
112+
_14 = &mut _13;
113+
_15 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(move _14) -> [return: bb5, unwind: bb11];
118114
}
119115

120116
bb5: {
121-
StorageDead(_15);
122-
_17 = discriminant(_16);
123-
switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10];
117+
StorageDead(_14);
118+
_16 = discriminant(_15);
119+
switchInt(move _16) -> [0: bb6, 1: bb8, otherwise: bb10];
124120
}
125121

126122
bb6: {
127-
StorageDead(_16);
128-
StorageDead(_14);
123+
StorageDead(_15);
124+
StorageDead(_13);
129125
drop(_2) -> [return: bb7, unwind continue];
130126
}
131127

@@ -134,19 +130,19 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
134130
}
135131

136132
bb8: {
137-
_18 = (((_16 as Some).0: (usize, &T)).0: usize);
138-
_19 = (((_16 as Some).0: (usize, &T)).1: &T);
133+
_17 = (((_15 as Some).0: (usize, &T)).0: usize);
134+
_18 = (((_15 as Some).0: (usize, &T)).1: &T);
135+
StorageLive(_19);
136+
_19 = &_2;
139137
StorageLive(_20);
140-
_20 = &_2;
141-
StorageLive(_21);
142-
_21 = (_18, _19);
143-
_22 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _20, move _21) -> [return: bb9, unwind: bb11];
138+
_20 = (_17, _18);
139+
_21 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _19, move _20) -> [return: bb9, unwind: bb11];
144140
}
145141

146142
bb9: {
147-
StorageDead(_21);
148143
StorageDead(_20);
149-
StorageDead(_16);
144+
StorageDead(_19);
145+
StorageDead(_15);
150146
goto -> bb4;
151147
}
152148

‎tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-abort.mir

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
44
debug slice => _1;
55
debug f => _2;
66
let mut _0: ();
7+
let mut _11: std::slice::Iter<'_, T>;
78
let mut _12: std::slice::Iter<'_, T>;
8-
let mut _13: std::slice::Iter<'_, T>;
9-
let mut _14: &mut std::slice::Iter<'_, T>;
10-
let mut _15: std::option::Option<&T>;
11-
let mut _16: isize;
12-
let mut _18: &impl Fn(&T);
13-
let mut _19: (&T,);
14-
let _20: ();
9+
let mut _13: &mut std::slice::Iter<'_, T>;
10+
let mut _14: std::option::Option<&T>;
11+
let mut _15: isize;
12+
let mut _17: &impl Fn(&T);
13+
let mut _18: (&T,);
14+
let _19: ();
1515
scope 1 {
16-
debug iter => _13;
17-
let _17: &T;
16+
debug iter => _12;
17+
let _16: &T;
1818
scope 2 {
19-
debug x => _17;
19+
debug x => _16;
2020
}
2121
}
2222
scope 3 (inlined core::slice::<impl [T]>::iter) {
@@ -25,11 +25,10 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
2525
let mut _7: bool;
2626
let mut _8: *mut T;
2727
let mut _9: *mut T;
28-
let mut _11: *const T;
28+
let mut _10: *const T;
2929
scope 5 {
3030
let _6: std::ptr::NonNull<T>;
3131
scope 6 {
32-
let _10: *const T;
3332
scope 7 {
3433
}
3534
scope 11 (inlined without_provenance::<T>) {
@@ -56,13 +55,13 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
5655
bb0: {
5756
StorageLive(_3);
5857
StorageLive(_6);
58+
StorageLive(_10);
5959
StorageLive(_4);
6060
StorageLive(_5);
6161
_3 = Len((*_1));
6262
_4 = &raw const (*_1);
6363
_5 = _4 as *const T (PtrToPtr);
6464
_6 = NonNull::<T> { pointer: _5 };
65-
StorageLive(_10);
6665
StorageLive(_7);
6766
_7 = const <T as std::mem::SizedTypeProperties>::IS_ZST;
6867
switchInt(move _7) -> [0: bb1, otherwise: bb2];
@@ -86,36 +85,33 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
8685

8786
bb3: {
8887
StorageDead(_7);
89-
StorageLive(_11);
90-
_11 = _10;
91-
_12 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _11, _marker: const ZeroSized: PhantomData<&T> };
92-
StorageDead(_11);
93-
StorageDead(_10);
88+
_11 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _10, _marker: const ZeroSized: PhantomData<&T> };
9489
StorageDead(_5);
9590
StorageDead(_4);
91+
StorageDead(_10);
9692
StorageDead(_6);
9793
StorageDead(_3);
98-
StorageLive(_13);
99-
_13 = _12;
94+
StorageLive(_12);
95+
_12 = _11;
10096
goto -> bb4;
10197
}
10298

10399
bb4: {
104-
StorageLive(_15);
105100
StorageLive(_14);
106-
_14 = &mut _13;
107-
_15 = <std::slice::Iter<'_, T> as Iterator>::next(move _14) -> [return: bb5, unwind unreachable];
101+
StorageLive(_13);
102+
_13 = &mut _12;
103+
_14 = <std::slice::Iter<'_, T> as Iterator>::next(move _13) -> [return: bb5, unwind unreachable];
108104
}
109105

110106
bb5: {
111-
StorageDead(_14);
112-
_16 = discriminant(_15);
113-
switchInt(move _16) -> [0: bb6, 1: bb8, otherwise: bb10];
107+
StorageDead(_13);
108+
_15 = discriminant(_14);
109+
switchInt(move _15) -> [0: bb6, 1: bb8, otherwise: bb10];
114110
}
115111

116112
bb6: {
117-
StorageDead(_15);
118-
StorageDead(_13);
113+
StorageDead(_14);
114+
StorageDead(_12);
119115
drop(_2) -> [return: bb7, unwind unreachable];
120116
}
121117

@@ -124,18 +120,18 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
124120
}
125121

126122
bb8: {
127-
_17 = ((_15 as Some).0: &T);
123+
_16 = ((_14 as Some).0: &T);
124+
StorageLive(_17);
125+
_17 = &_2;
128126
StorageLive(_18);
129-
_18 = &_2;
130-
StorageLive(_19);
131-
_19 = (_17,);
132-
_20 = <impl Fn(&T) as Fn<(&T,)>>::call(move _18, move _19) -> [return: bb9, unwind unreachable];
127+
_18 = (_16,);
128+
_19 = <impl Fn(&T) as Fn<(&T,)>>::call(move _17, move _18) -> [return: bb9, unwind unreachable];
133129
}
134130

135131
bb9: {
136-
StorageDead(_19);
137132
StorageDead(_18);
138-
StorageDead(_15);
133+
StorageDead(_17);
134+
StorageDead(_14);
139135
goto -> bb4;
140136
}
141137

‎tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-unwind.mir

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
44
debug slice => _1;
55
debug f => _2;
66
let mut _0: ();
7+
let mut _11: std::slice::Iter<'_, T>;
78
let mut _12: std::slice::Iter<'_, T>;
8-
let mut _13: std::slice::Iter<'_, T>;
9-
let mut _14: &mut std::slice::Iter<'_, T>;
10-
let mut _15: std::option::Option<&T>;
11-
let mut _16: isize;
12-
let mut _18: &impl Fn(&T);
13-
let mut _19: (&T,);
14-
let _20: ();
9+
let mut _13: &mut std::slice::Iter<'_, T>;
10+
let mut _14: std::option::Option<&T>;
11+
let mut _15: isize;
12+
let mut _17: &impl Fn(&T);
13+
let mut _18: (&T,);
14+
let _19: ();
1515
scope 1 {
16-
debug iter => _13;
17-
let _17: &T;
16+
debug iter => _12;
17+
let _16: &T;
1818
scope 2 {
19-
debug x => _17;
19+
debug x => _16;
2020
}
2121
}
2222
scope 3 (inlined core::slice::<impl [T]>::iter) {
@@ -25,11 +25,10 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
2525
let mut _7: bool;
2626
let mut _8: *mut T;
2727
let mut _9: *mut T;
28-
let mut _11: *const T;
28+
let mut _10: *const T;
2929
scope 5 {
3030
let _6: std::ptr::NonNull<T>;
3131
scope 6 {
32-
let _10: *const T;
3332
scope 7 {
3433
}
3534
scope 11 (inlined without_provenance::<T>) {
@@ -56,13 +55,13 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
5655
bb0: {
5756
StorageLive(_3);
5857
StorageLive(_6);
58+
StorageLive(_10);
5959
StorageLive(_4);
6060
StorageLive(_5);
6161
_3 = Len((*_1));
6262
_4 = &raw const (*_1);
6363
_5 = _4 as *const T (PtrToPtr);
6464
_6 = NonNull::<T> { pointer: _5 };
65-
StorageLive(_10);
6665
StorageLive(_7);
6766
_7 = const <T as std::mem::SizedTypeProperties>::IS_ZST;
6867
switchInt(move _7) -> [0: bb1, otherwise: bb2];
@@ -86,36 +85,33 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
8685

8786
bb3: {
8887
StorageDead(_7);
89-
StorageLive(_11);
90-
_11 = _10;
91-
_12 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _11, _marker: const ZeroSized: PhantomData<&T> };
92-
StorageDead(_11);
93-
StorageDead(_10);
88+
_11 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _10, _marker: const ZeroSized: PhantomData<&T> };
9489
StorageDead(_5);
9590
StorageDead(_4);
91+
StorageDead(_10);
9692
StorageDead(_6);
9793
StorageDead(_3);
98-
StorageLive(_13);
99-
_13 = _12;
94+
StorageLive(_12);
95+
_12 = _11;
10096
goto -> bb4;
10197
}
10298

10399
bb4: {
104-
StorageLive(_15);
105100
StorageLive(_14);
106-
_14 = &mut _13;
107-
_15 = <std::slice::Iter<'_, T> as Iterator>::next(move _14) -> [return: bb5, unwind: bb11];
101+
StorageLive(_13);
102+
_13 = &mut _12;
103+
_14 = <std::slice::Iter<'_, T> as Iterator>::next(move _13) -> [return: bb5, unwind: bb11];
108104
}
109105

110106
bb5: {
111-
StorageDead(_14);
112-
_16 = discriminant(_15);
113-
switchInt(move _16) -> [0: bb6, 1: bb8, otherwise: bb10];
107+
StorageDead(_13);
108+
_15 = discriminant(_14);
109+
switchInt(move _15) -> [0: bb6, 1: bb8, otherwise: bb10];
114110
}
115111

116112
bb6: {
117-
StorageDead(_15);
118-
StorageDead(_13);
113+
StorageDead(_14);
114+
StorageDead(_12);
119115
drop(_2) -> [return: bb7, unwind continue];
120116
}
121117

@@ -124,18 +120,18 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
124120
}
125121

126122
bb8: {
127-
_17 = ((_15 as Some).0: &T);
123+
_16 = ((_14 as Some).0: &T);
124+
StorageLive(_17);
125+
_17 = &_2;
128126
StorageLive(_18);
129-
_18 = &_2;
130-
StorageLive(_19);
131-
_19 = (_17,);
132-
_20 = <impl Fn(&T) as Fn<(&T,)>>::call(move _18, move _19) -> [return: bb9, unwind: bb11];
127+
_18 = (_16,);
128+
_19 = <impl Fn(&T) as Fn<(&T,)>>::call(move _17, move _18) -> [return: bb9, unwind: bb11];
133129
}
134130

135131
bb9: {
136-
StorageDead(_19);
137132
StorageDead(_18);
138-
StorageDead(_15);
133+
StorageDead(_17);
134+
StorageDead(_14);
139135
goto -> bb4;
140136
}
141137

‎tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-abort.mir

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,27 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
66
let mut _0: ();
77
let mut _3: usize;
88
let mut _4: usize;
9-
let mut _9: std::option::Option<usize>;
10-
let mut _11: usize;
11-
let mut _12: bool;
12-
let mut _14: &impl Fn(usize, &T);
13-
let mut _15: (usize, &T);
14-
let _16: ();
9+
let mut _8: std::option::Option<usize>;
10+
let mut _10: usize;
11+
let mut _11: bool;
12+
let mut _13: &impl Fn(usize, &T);
13+
let mut _14: (usize, &T);
14+
let _15: ();
1515
scope 1 {
1616
debug ((iter: std::ops::Range<usize>).0: usize) => _4;
1717
debug ((iter: std::ops::Range<usize>).1: usize) => _3;
18-
let _10: usize;
18+
let _9: usize;
1919
scope 2 {
20-
debug i => _10;
21-
let _13: &T;
20+
debug i => _9;
21+
let _12: &T;
2222
scope 3 {
23-
debug x => _13;
23+
debug x => _12;
2424
}
2525
}
2626
scope 5 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) {
2727
scope 6 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) {
2828
let mut _6: bool;
2929
let _7: usize;
30-
let mut _8: usize;
3130
scope 7 {
3231
}
3332
scope 8 (inlined std::cmp::impls::<impl PartialOrd for usize>::lt) {
@@ -41,13 +40,12 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
4140

4241
bb0: {
4342
_3 = Len((*_1));
44-
StorageLive(_4);
4543
_4 = const 0_usize;
4644
goto -> bb1;
4745
}
4846

4947
bb1: {
50-
StorageLive(_9);
48+
StorageLive(_8);
5149
StorageLive(_7);
5250
StorageLive(_6);
5351
StorageLive(_5);
@@ -60,8 +58,7 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
6058
bb2: {
6159
StorageDead(_6);
6260
StorageDead(_7);
63-
StorageDead(_9);
64-
StorageDead(_4);
61+
StorageDead(_8);
6562
drop(_2) -> [return: bb3, unwind unreachable];
6663
}
6764

@@ -71,35 +68,32 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
7168

7269
bb4: {
7370
_7 = _4;
74-
StorageLive(_8);
75-
_8 = <usize as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb5, unwind unreachable];
71+
_4 = <usize as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb5, unwind unreachable];
7672
}
7773

7874
bb5: {
79-
_4 = move _8;
80-
StorageDead(_8);
81-
_9 = Option::<usize>::Some(_7);
75+
_8 = Option::<usize>::Some(_7);
8276
StorageDead(_6);
8377
StorageDead(_7);
84-
_10 = ((_9 as Some).0: usize);
85-
_11 = Len((*_1));
86-
_12 = Lt(_10, _11);
87-
assert(move _12, "index out of bounds: the length is {} but the index is {}", move _11, _10) -> [success: bb6, unwind unreachable];
78+
_9 = ((_8 as Some).0: usize);
79+
_10 = Len((*_1));
80+
_11 = Lt(_9, _10);
81+
assert(move _11, "index out of bounds: the length is {} but the index is {}", move _10, _9) -> [success: bb6, unwind unreachable];
8882
}
8983

9084
bb6: {
91-
_13 = &(*_1)[_10];
85+
_12 = &(*_1)[_9];
86+
StorageLive(_13);
87+
_13 = &_2;
9288
StorageLive(_14);
93-
_14 = &_2;
94-
StorageLive(_15);
95-
_15 = (_10, _13);
96-
_16 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _14, move _15) -> [return: bb7, unwind unreachable];
89+
_14 = (_9, _12);
90+
_15 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _13, move _14) -> [return: bb7, unwind unreachable];
9791
}
9892

9993
bb7: {
100-
StorageDead(_15);
10194
StorageDead(_14);
102-
StorageDead(_9);
95+
StorageDead(_13);
96+
StorageDead(_8);
10397
goto -> bb1;
10498
}
10599
}

‎tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-unwind.mir

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,27 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
66
let mut _0: ();
77
let mut _3: usize;
88
let mut _4: usize;
9-
let mut _9: std::option::Option<usize>;
10-
let mut _11: usize;
11-
let mut _12: bool;
12-
let mut _14: &impl Fn(usize, &T);
13-
let mut _15: (usize, &T);
14-
let _16: ();
9+
let mut _8: std::option::Option<usize>;
10+
let mut _10: usize;
11+
let mut _11: bool;
12+
let mut _13: &impl Fn(usize, &T);
13+
let mut _14: (usize, &T);
14+
let _15: ();
1515
scope 1 {
1616
debug ((iter: std::ops::Range<usize>).0: usize) => _4;
1717
debug ((iter: std::ops::Range<usize>).1: usize) => _3;
18-
let _10: usize;
18+
let _9: usize;
1919
scope 2 {
20-
debug i => _10;
21-
let _13: &T;
20+
debug i => _9;
21+
let _12: &T;
2222
scope 3 {
23-
debug x => _13;
23+
debug x => _12;
2424
}
2525
}
2626
scope 5 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) {
2727
scope 6 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) {
2828
let mut _6: bool;
2929
let _7: usize;
30-
let mut _8: usize;
3130
scope 7 {
3231
}
3332
scope 8 (inlined std::cmp::impls::<impl PartialOrd for usize>::lt) {
@@ -41,13 +40,12 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
4140

4241
bb0: {
4342
_3 = Len((*_1));
44-
StorageLive(_4);
4543
_4 = const 0_usize;
4644
goto -> bb1;
4745
}
4846

4947
bb1: {
50-
StorageLive(_9);
48+
StorageLive(_8);
5149
StorageLive(_7);
5250
StorageLive(_6);
5351
StorageLive(_5);
@@ -60,8 +58,7 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
6058
bb2: {
6159
StorageDead(_6);
6260
StorageDead(_7);
63-
StorageDead(_9);
64-
StorageDead(_4);
61+
StorageDead(_8);
6562
drop(_2) -> [return: bb3, unwind continue];
6663
}
6764

@@ -71,35 +68,32 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
7168

7269
bb4: {
7370
_7 = _4;
74-
StorageLive(_8);
75-
_8 = <usize as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb5, unwind: bb8];
71+
_4 = <usize as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb5, unwind: bb8];
7672
}
7773

7874
bb5: {
79-
_4 = move _8;
80-
StorageDead(_8);
81-
_9 = Option::<usize>::Some(_7);
75+
_8 = Option::<usize>::Some(_7);
8276
StorageDead(_6);
8377
StorageDead(_7);
84-
_10 = ((_9 as Some).0: usize);
85-
_11 = Len((*_1));
86-
_12 = Lt(_10, _11);
87-
assert(move _12, "index out of bounds: the length is {} but the index is {}", move _11, _10) -> [success: bb6, unwind: bb8];
78+
_9 = ((_8 as Some).0: usize);
79+
_10 = Len((*_1));
80+
_11 = Lt(_9, _10);
81+
assert(move _11, "index out of bounds: the length is {} but the index is {}", move _10, _9) -> [success: bb6, unwind: bb8];
8882
}
8983

9084
bb6: {
91-
_13 = &(*_1)[_10];
85+
_12 = &(*_1)[_9];
86+
StorageLive(_13);
87+
_13 = &_2;
9288
StorageLive(_14);
93-
_14 = &_2;
94-
StorageLive(_15);
95-
_15 = (_10, _13);
96-
_16 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _14, move _15) -> [return: bb7, unwind: bb8];
89+
_14 = (_9, _12);
90+
_15 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _13, move _14) -> [return: bb7, unwind: bb8];
9791
}
9892

9993
bb7: {
100-
StorageDead(_15);
10194
StorageDead(_14);
102-
StorageDead(_9);
95+
StorageDead(_13);
96+
StorageDead(_8);
10397
goto -> bb1;
10498
}
10599

‎tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-abort.mir

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
44
debug slice => _1;
55
debug f => _2;
66
let mut _0: ();
7-
let mut _12: std::slice::Iter<'_, T>;
7+
let mut _11: std::slice::Iter<'_, T>;
8+
let mut _12: std::iter::Rev<std::slice::Iter<'_, T>>;
89
let mut _13: std::iter::Rev<std::slice::Iter<'_, T>>;
9-
let mut _14: std::iter::Rev<std::slice::Iter<'_, T>>;
10-
let mut _16: std::option::Option<&T>;
11-
let mut _17: isize;
12-
let mut _19: &impl Fn(&T);
13-
let mut _20: (&T,);
14-
let _21: ();
10+
let mut _15: std::option::Option<&T>;
11+
let mut _16: isize;
12+
let mut _18: &impl Fn(&T);
13+
let mut _19: (&T,);
14+
let _20: ();
1515
scope 1 {
16-
debug iter => _14;
17-
let _18: &T;
16+
debug iter => _13;
17+
let _17: &T;
1818
scope 2 {
19-
debug x => _18;
19+
debug x => _17;
2020
}
2121
scope 17 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
22-
let mut _15: &mut std::slice::Iter<'_, T>;
22+
let mut _14: &mut std::slice::Iter<'_, T>;
2323
}
2424
}
2525
scope 3 (inlined core::slice::<impl [T]>::iter) {
@@ -28,11 +28,10 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
2828
let mut _7: bool;
2929
let mut _8: *mut T;
3030
let mut _9: *mut T;
31-
let mut _11: *const T;
31+
let mut _10: *const T;
3232
scope 5 {
3333
let _6: std::ptr::NonNull<T>;
3434
scope 6 {
35-
let _10: *const T;
3635
scope 7 {
3736
}
3837
scope 11 (inlined without_provenance::<T>) {
@@ -61,16 +60,16 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
6160
}
6261

6362
bb0: {
64-
StorageLive(_12);
63+
StorageLive(_11);
6564
StorageLive(_3);
6665
StorageLive(_6);
66+
StorageLive(_10);
6767
StorageLive(_4);
6868
StorageLive(_5);
6969
_3 = Len((*_1));
7070
_4 = &raw const (*_1);
7171
_5 = _4 as *const T (PtrToPtr);
7272
_6 = NonNull::<T> { pointer: _5 };
73-
StorageLive(_10);
7473
StorageLive(_7);
7574
_7 = const <T as std::mem::SizedTypeProperties>::IS_ZST;
7675
switchInt(move _7) -> [0: bb1, otherwise: bb2];
@@ -94,38 +93,35 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
9493

9594
bb3: {
9695
StorageDead(_7);
97-
StorageLive(_11);
98-
_11 = _10;
99-
_12 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _11, _marker: const ZeroSized: PhantomData<&T> };
100-
StorageDead(_11);
101-
StorageDead(_10);
96+
_11 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _10, _marker: const ZeroSized: PhantomData<&T> };
10297
StorageDead(_5);
10398
StorageDead(_4);
99+
StorageDead(_10);
104100
StorageDead(_6);
105101
StorageDead(_3);
106-
_13 = Rev::<std::slice::Iter<'_, T>> { iter: _12 };
107-
StorageDead(_12);
108-
StorageLive(_14);
109-
_14 = _13;
102+
_12 = Rev::<std::slice::Iter<'_, T>> { iter: _11 };
103+
StorageDead(_11);
104+
StorageLive(_13);
105+
_13 = _12;
110106
goto -> bb4;
111107
}
112108

113109
bb4: {
114-
StorageLive(_16);
115110
StorageLive(_15);
116-
_15 = &mut (_14.0: std::slice::Iter<'_, T>);
117-
_16 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _15) -> [return: bb5, unwind unreachable];
111+
StorageLive(_14);
112+
_14 = &mut (_13.0: std::slice::Iter<'_, T>);
113+
_15 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _14) -> [return: bb5, unwind unreachable];
118114
}
119115

120116
bb5: {
121-
StorageDead(_15);
122-
_17 = discriminant(_16);
123-
switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10];
117+
StorageDead(_14);
118+
_16 = discriminant(_15);
119+
switchInt(move _16) -> [0: bb6, 1: bb8, otherwise: bb10];
124120
}
125121

126122
bb6: {
127-
StorageDead(_16);
128-
StorageDead(_14);
123+
StorageDead(_15);
124+
StorageDead(_13);
129125
drop(_2) -> [return: bb7, unwind unreachable];
130126
}
131127

@@ -134,18 +130,18 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
134130
}
135131

136132
bb8: {
137-
_18 = ((_16 as Some).0: &T);
133+
_17 = ((_15 as Some).0: &T);
134+
StorageLive(_18);
135+
_18 = &_2;
138136
StorageLive(_19);
139-
_19 = &_2;
140-
StorageLive(_20);
141-
_20 = (_18,);
142-
_21 = <impl Fn(&T) as Fn<(&T,)>>::call(move _19, move _20) -> [return: bb9, unwind unreachable];
137+
_19 = (_17,);
138+
_20 = <impl Fn(&T) as Fn<(&T,)>>::call(move _18, move _19) -> [return: bb9, unwind unreachable];
143139
}
144140

145141
bb9: {
146-
StorageDead(_20);
147142
StorageDead(_19);
148-
StorageDead(_16);
143+
StorageDead(_18);
144+
StorageDead(_15);
149145
goto -> bb4;
150146
}
151147

‎tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-unwind.mir

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
44
debug slice => _1;
55
debug f => _2;
66
let mut _0: ();
7-
let mut _12: std::slice::Iter<'_, T>;
7+
let mut _11: std::slice::Iter<'_, T>;
8+
let mut _12: std::iter::Rev<std::slice::Iter<'_, T>>;
89
let mut _13: std::iter::Rev<std::slice::Iter<'_, T>>;
9-
let mut _14: std::iter::Rev<std::slice::Iter<'_, T>>;
10-
let mut _16: std::option::Option<&T>;
11-
let mut _17: isize;
12-
let mut _19: &impl Fn(&T);
13-
let mut _20: (&T,);
14-
let _21: ();
10+
let mut _15: std::option::Option<&T>;
11+
let mut _16: isize;
12+
let mut _18: &impl Fn(&T);
13+
let mut _19: (&T,);
14+
let _20: ();
1515
scope 1 {
16-
debug iter => _14;
17-
let _18: &T;
16+
debug iter => _13;
17+
let _17: &T;
1818
scope 2 {
19-
debug x => _18;
19+
debug x => _17;
2020
}
2121
scope 17 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
22-
let mut _15: &mut std::slice::Iter<'_, T>;
22+
let mut _14: &mut std::slice::Iter<'_, T>;
2323
}
2424
}
2525
scope 3 (inlined core::slice::<impl [T]>::iter) {
@@ -28,11 +28,10 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
2828
let mut _7: bool;
2929
let mut _8: *mut T;
3030
let mut _9: *mut T;
31-
let mut _11: *const T;
31+
let mut _10: *const T;
3232
scope 5 {
3333
let _6: std::ptr::NonNull<T>;
3434
scope 6 {
35-
let _10: *const T;
3635
scope 7 {
3736
}
3837
scope 11 (inlined without_provenance::<T>) {
@@ -61,16 +60,16 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
6160
}
6261

6362
bb0: {
64-
StorageLive(_12);
63+
StorageLive(_11);
6564
StorageLive(_3);
6665
StorageLive(_6);
66+
StorageLive(_10);
6767
StorageLive(_4);
6868
StorageLive(_5);
6969
_3 = Len((*_1));
7070
_4 = &raw const (*_1);
7171
_5 = _4 as *const T (PtrToPtr);
7272
_6 = NonNull::<T> { pointer: _5 };
73-
StorageLive(_10);
7473
StorageLive(_7);
7574
_7 = const <T as std::mem::SizedTypeProperties>::IS_ZST;
7675
switchInt(move _7) -> [0: bb1, otherwise: bb2];
@@ -94,38 +93,35 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
9493

9594
bb3: {
9695
StorageDead(_7);
97-
StorageLive(_11);
98-
_11 = _10;
99-
_12 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _11, _marker: const ZeroSized: PhantomData<&T> };
100-
StorageDead(_11);
101-
StorageDead(_10);
96+
_11 = std::slice::Iter::<'_, T> { ptr: _6, end_or_len: move _10, _marker: const ZeroSized: PhantomData<&T> };
10297
StorageDead(_5);
10398
StorageDead(_4);
99+
StorageDead(_10);
104100
StorageDead(_6);
105101
StorageDead(_3);
106-
_13 = Rev::<std::slice::Iter<'_, T>> { iter: _12 };
107-
StorageDead(_12);
108-
StorageLive(_14);
109-
_14 = _13;
102+
_12 = Rev::<std::slice::Iter<'_, T>> { iter: _11 };
103+
StorageDead(_11);
104+
StorageLive(_13);
105+
_13 = _12;
110106
goto -> bb4;
111107
}
112108

113109
bb4: {
114-
StorageLive(_16);
115110
StorageLive(_15);
116-
_15 = &mut (_14.0: std::slice::Iter<'_, T>);
117-
_16 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _15) -> [return: bb5, unwind: bb11];
111+
StorageLive(_14);
112+
_14 = &mut (_13.0: std::slice::Iter<'_, T>);
113+
_15 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _14) -> [return: bb5, unwind: bb11];
118114
}
119115

120116
bb5: {
121-
StorageDead(_15);
122-
_17 = discriminant(_16);
123-
switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10];
117+
StorageDead(_14);
118+
_16 = discriminant(_15);
119+
switchInt(move _16) -> [0: bb6, 1: bb8, otherwise: bb10];
124120
}
125121

126122
bb6: {
127-
StorageDead(_16);
128-
StorageDead(_14);
123+
StorageDead(_15);
124+
StorageDead(_13);
129125
drop(_2) -> [return: bb7, unwind continue];
130126
}
131127

@@ -134,18 +130,18 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
134130
}
135131

136132
bb8: {
137-
_18 = ((_16 as Some).0: &T);
133+
_17 = ((_15 as Some).0: &T);
134+
StorageLive(_18);
135+
_18 = &_2;
138136
StorageLive(_19);
139-
_19 = &_2;
140-
StorageLive(_20);
141-
_20 = (_18,);
142-
_21 = <impl Fn(&T) as Fn<(&T,)>>::call(move _19, move _20) -> [return: bb9, unwind: bb11];
137+
_19 = (_17,);
138+
_20 = <impl Fn(&T) as Fn<(&T,)>>::call(move _18, move _19) -> [return: bb9, unwind: bb11];
143139
}
144140

145141
bb9: {
146-
StorageDead(_20);
147142
StorageDead(_19);
148-
StorageDead(_16);
143+
StorageDead(_18);
144+
StorageDead(_15);
149145
goto -> bb4;
150146
}
151147

0 commit comments

Comments
 (0)
Please sign in to comment.