rust/src/test/mir-opt/separate_const_switch.identity.ConstProp.diff
Wesley Wiser 0a42dfc2fa Fix debugger stepping behavior around match expressions
Previously, we would set up the source lines for `match` expressions so
that the code generated to perform the test of the scrutinee was matched
to the line of the arm that required the test and then jump from the arm
block to the "next" block was matched to all of the lines in the `match`
expression.

While that makes sense, it has the side effect of causing strange
stepping behavior in debuggers.

I've changed the source information so that all of the generated tests
are sourced to `match {scrutinee}` and the jumps are sourced to the last
line of the block they are inside. This resolves the weird stepping
behavior in all debuggers and resolves some instances of "ambiguous
symbol" errors in WinDbg preventing the user from setting breakpoints at
`match` expressions.
2021-08-25 15:17:22 -04:00

140 lines
11 KiB
Diff

- // MIR for `identity` before ConstProp
+ // MIR for `identity` after ConstProp
fn identity(_1: Result<i32, i32>) -> Result<i32, i32> {
debug x => _1; // in scope 0 at $DIR/separate_const_switch.rs:28:13: 28:14
let mut _0: std::result::Result<i32, i32>; // return place in scope 0 at $DIR/separate_const_switch.rs:28:37: 28:53
let mut _2: i32; // in scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _3: std::ops::ControlFlow<std::result::Result<std::convert::Infallible, i32>, i32>; // in scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _4: std::result::Result<i32, i32>; // in scope 0 at $DIR/separate_const_switch.rs:29:8: 29:9
let mut _5: isize; // in scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
let _6: std::result::Result<std::convert::Infallible, i32>; // in scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
let mut _7: !; // in scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
let mut _8: std::result::Result<std::convert::Infallible, i32>; // in scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
let _9: i32; // in scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
scope 1 {
debug residual => _6; // in scope 1 at $DIR/separate_const_switch.rs:29:9: 29:10
scope 2 {
scope 8 (inlined <Result<i32, i32> as FromResidual<Result<Infallible, i32>>>::from_residual) { // at $DIR/separate_const_switch.rs:29:8: 29:10
debug residual => _8; // in scope 8 at $DIR/separate_const_switch.rs:29:8: 29:10
let _16: i32; // in scope 8 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _17: i32; // in scope 8 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _18: i32; // in scope 8 at $DIR/separate_const_switch.rs:29:8: 29:10
scope 9 {
debug e => _16; // in scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
scope 10 (inlined <i32 as From<i32>>::from) { // at $DIR/separate_const_switch.rs:29:8: 29:10
debug t => _18; // in scope 10 at $DIR/separate_const_switch.rs:29:8: 29:10
}
}
}
}
}
scope 3 {
debug val => _9; // in scope 3 at $DIR/separate_const_switch.rs:29:8: 29:10
scope 4 {
}
}
scope 5 (inlined <Result<i32, i32> as Try>::branch) { // at $DIR/separate_const_switch.rs:29:8: 29:10
debug self => _4; // in scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _10: isize; // in scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
let _11: i32; // in scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _12: i32; // in scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
let _13: i32; // in scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _14: std::result::Result<std::convert::Infallible, i32>; // in scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
let mut _15: i32; // in scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
scope 6 {
debug v => _11; // in scope 6 at $DIR/separate_const_switch.rs:29:8: 29:10
}
scope 7 {
debug e => _13; // in scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
}
}
bb0: {
StorageLive(_2); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageLive(_3); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageLive(_4); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:9
_4 = _1; // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:9
StorageLive(_10); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
_10 = discriminant(_4); // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
switchInt(move _10) -> [0_isize: bb5, 1_isize: bb3, otherwise: bb4]; // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
}
bb1: {
StorageLive(_9); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
_9 = ((_3 as Continue).0: i32); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
_2 = _9; // scope 4 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_9); // scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
((_0 as Ok).0: i32) = move _2; // scope 0 at $DIR/separate_const_switch.rs:29:5: 29:11
discriminant(_0) = 0; // scope 0 at $DIR/separate_const_switch.rs:29:5: 29:11
StorageDead(_2); // scope 0 at $DIR/separate_const_switch.rs:29:10: 29:11
StorageDead(_3); // scope 0 at $DIR/separate_const_switch.rs:30:1: 30:2
return; // scope 0 at $DIR/separate_const_switch.rs:30:2: 30:2
}
bb2: {
StorageLive(_6); // scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
_6 = ((_3 as Break).0: std::result::Result<std::convert::Infallible, i32>); // scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
StorageLive(_8); // scope 2 at $DIR/separate_const_switch.rs:29:9: 29:10
_8 = _6; // scope 2 at $DIR/separate_const_switch.rs:29:9: 29:10
StorageLive(_16); // scope 8 at $DIR/separate_const_switch.rs:29:8: 29:10
_16 = move ((_8 as Err).0: i32); // scope 8 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageLive(_17); // scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageLive(_18); // scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
_18 = move _16; // scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
_17 = move _18; // scope 10 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_18); // scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
((_0 as Err).0: i32) = move _17; // scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
discriminant(_0) = 1; // scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_17); // scope 9 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_16); // scope 8 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_8); // scope 2 at $DIR/separate_const_switch.rs:29:9: 29:10
StorageDead(_6); // scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
StorageDead(_2); // scope 0 at $DIR/separate_const_switch.rs:29:10: 29:11
StorageDead(_3); // scope 0 at $DIR/separate_const_switch.rs:30:1: 30:2
return; // scope 0 at $DIR/separate_const_switch.rs:30:2: 30:2
}
bb3: {
StorageLive(_13); // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
_13 = move ((_4 as Err).0: i32); // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageLive(_14); // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageLive(_15); // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
_15 = move _13; // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
((_14 as Err).0: i32) = move _15; // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
discriminant(_14) = 1; // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_15); // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
((_3 as Break).0: std::result::Result<std::convert::Infallible, i32>) = move _14; // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
discriminant(_3) = 1; // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_14); // scope 7 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_13); // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_10); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_4); // scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
- _5 = discriminant(_3); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
- switchInt(move _5) -> [0_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
+ _5 = const 1_isize; // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
+ switchInt(const 1_isize) -> [0_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
}
bb4: {
unreachable; // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
}
bb5: {
StorageLive(_11); // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
_11 = move ((_4 as Ok).0: i32); // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageLive(_12); // scope 6 at $DIR/separate_const_switch.rs:29:8: 29:10
_12 = move _11; // scope 6 at $DIR/separate_const_switch.rs:29:8: 29:10
((_3 as Continue).0: i32) = move _12; // scope 6 at $DIR/separate_const_switch.rs:29:8: 29:10
discriminant(_3) = 0; // scope 6 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_12); // scope 6 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_11); // scope 5 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_10); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
StorageDead(_4); // scope 0 at $DIR/separate_const_switch.rs:29:9: 29:10
- _5 = discriminant(_3); // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
- switchInt(move _5) -> [0_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
+ _5 = const 0_isize; // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
+ switchInt(const 0_isize) -> [0_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/separate_const_switch.rs:29:8: 29:10
}
}