mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-13 02:17:41 +00:00

Stop pessimizing the use of local variables in core by skipping debug info for MIR temporaries in tiny (single-BB) functions. For functions as simple as this -- `Pin::new`, etc -- nobody every actually wants debuginfo for them in the first place. They're more like intrinsics than real functions, and stepping over them is good.
125 lines
3.5 KiB
Diff
125 lines
3.5 KiB
Diff
- // MIR for `main` before Inline
|
|
+ // MIR for `main` after Inline
|
|
|
|
fn main() -> () {
|
|
let mut _0: ();
|
|
let _1: std::ops::CoroutineState<i32, bool>;
|
|
let mut _2: std::pin::Pin<&mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8}>;
|
|
let mut _3: &mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8};
|
|
let mut _4: {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8};
|
|
+ let mut _5: bool;
|
|
scope 1 {
|
|
debug _r => _1;
|
|
}
|
|
+ scope 2 (inlined g) {
|
|
+ }
|
|
+ scope 3 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8}>::new) {
|
|
+ debug pointer => _3;
|
|
+ scope 4 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8}>::new_unchecked) {
|
|
+ }
|
|
+ }
|
|
+ scope 5 (inlined g::{closure#0}) {
|
|
+ debug a => _5;
|
|
+ let mut _6: &mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8};
|
|
+ let mut _7: u32;
|
|
+ let mut _8: i32;
|
|
+ }
|
|
|
|
bb0: {
|
|
StorageLive(_1);
|
|
StorageLive(_2);
|
|
StorageLive(_3);
|
|
StorageLive(_4);
|
|
- _4 = g() -> [return: bb1, unwind continue];
|
|
+ _4 = {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8 (#0)};
|
|
+ _3 = &mut _4;
|
|
+ _2 = Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8}> { __pointer: copy _3 };
|
|
+ StorageDead(_3);
|
|
+ StorageLive(_5);
|
|
+ _5 = const false;
|
|
+ StorageLive(_6);
|
|
+ StorageLive(_7);
|
|
+ _6 = copy (_2.0: &mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8});
|
|
+ _7 = discriminant((*_6));
|
|
+ switchInt(move _7) -> [0: bb5, 1: bb9, 3: bb10, otherwise: bb11];
|
|
}
|
|
|
|
bb1: {
|
|
- _3 = &mut _4;
|
|
- _2 = Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:20:5: 20:8}>::new(move _3) -> [return: bb2, unwind: bb5];
|
|
+ StorageDead(_4);
|
|
+ _0 = const ();
|
|
+ StorageDead(_1);
|
|
+ return;
|
|
}
|
|
|
|
- bb2: {
|
|
- StorageDead(_3);
|
|
- _1 = <{coroutine@$DIR/inline_coroutine.rs:20:5: 20:8} as Coroutine<bool>>::resume(move _2, const false) -> [return: bb3, unwind: bb5];
|
|
+ bb2 (cleanup): {
|
|
+ drop(_4) -> [return: bb3, unwind terminate(cleanup)];
|
|
}
|
|
|
|
- bb3: {
|
|
- StorageDead(_2);
|
|
- drop(_4) -> [return: bb4, unwind: bb6];
|
|
+ bb3 (cleanup): {
|
|
+ resume;
|
|
}
|
|
|
|
bb4: {
|
|
- StorageDead(_4);
|
|
- _0 = const ();
|
|
- StorageDead(_1);
|
|
- return;
|
|
+ StorageDead(_7);
|
|
+ StorageDead(_6);
|
|
+ StorageDead(_5);
|
|
+ StorageDead(_2);
|
|
+ drop(_4) -> [return: bb1, unwind: bb3];
|
|
}
|
|
|
|
- bb5 (cleanup): {
|
|
- drop(_4) -> [return: bb6, unwind terminate(cleanup)];
|
|
+ bb5: {
|
|
+ StorageLive(_8);
|
|
+ switchInt(copy _5) -> [0: bb6, otherwise: bb7];
|
|
}
|
|
|
|
- bb6 (cleanup): {
|
|
- resume;
|
|
+ bb6: {
|
|
+ _8 = const 13_i32;
|
|
+ goto -> bb8;
|
|
+ }
|
|
+
|
|
+ bb7: {
|
|
+ _8 = const 7_i32;
|
|
+ goto -> bb8;
|
|
+ }
|
|
+
|
|
+ bb8: {
|
|
+ _1 = CoroutineState::<i32, bool>::Yielded(move _8);
|
|
+ StorageDead(_8);
|
|
+ discriminant((*_6)) = 3;
|
|
+ goto -> bb4;
|
|
+ }
|
|
+
|
|
+ bb9: {
|
|
+ assert(const false, "coroutine resumed after completion") -> [success: bb9, unwind: bb2];
|
|
+ }
|
|
+
|
|
+ bb10: {
|
|
+ StorageLive(_8);
|
|
+ StorageDead(_8);
|
|
+ _1 = CoroutineState::<i32, bool>::Complete(copy _5);
|
|
+ discriminant((*_6)) = 1;
|
|
+ goto -> bb4;
|
|
+ }
|
|
+
|
|
+ bb11: {
|
|
+ unreachable;
|
|
}
|
|
}
|
|
|