The optimization introduces additional uses of the discriminant operand, but does not ensure that it is still valid to evaluate it or that it still evaluates to the same value. Evaluate it once at original position, and store the result in a new temporary.
46 lines
2.5 KiB
Diff
46 lines
2.5 KiB
Diff
- // MIR for `foo` before MatchBranchSimplification
|
|
+ // MIR for `foo` after MatchBranchSimplification
|
|
|
|
fn foo(_1: Option<()>) -> () {
|
|
debug bar => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:6:8: 6:11
|
|
let mut _0: (); // return place in scope 0 at $DIR/matches_reduce_branches.rs:6:25: 6:25
|
|
let mut _2: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
|
let mut _3: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
+ let mut _4: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
|
|
bb0: {
|
|
StorageLive(_2); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
|
_3 = discriminant(_1); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
- switchInt(move _3) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
+ StorageLive(_4); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
+ _4 = move _3; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
+ _2 = Eq(_4, const 0_isize); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
|
+ StorageDead(_4); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
+ goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26
|
|
}
|
|
|
|
bb1: {
|
|
_2 = const false; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
|
goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
|
}
|
|
|
|
bb2: {
|
|
_2 = const true; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
|
goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
|
|
}
|
|
|
|
bb3: {
|
|
switchInt(_2) -> [false: bb4, otherwise: bb5]; // scope 0 at $DIR/matches_reduce_branches.rs:7:5: 9:6
|
|
}
|
|
|
|
bb4: {
|
|
_0 = const (); // scope 0 at $DIR/matches_reduce_branches.rs:7:5: 9:6
|
|
goto -> bb5; // scope 0 at $DIR/matches_reduce_branches.rs:7:5: 9:6
|
|
}
|
|
|
|
bb5: {
|
|
StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:10:1: 10:2
|
|
return; // scope 0 at $DIR/matches_reduce_branches.rs:10:2: 10:2
|
|
}
|
|
}
|
|
|