rust/src/test/mir-opt/not_equal_false.opt.InstCombine.diff
Tomasz Miąsko a4dc92b483 Introduce a temporary for discriminant value in MatchBranchSimplification
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.
2020-10-21 00:00:00 +00:00

59 lines
3.5 KiB
Diff

- // MIR for `opt` before InstCombine
+ // MIR for `opt` after InstCombine
fn opt(_1: Option<()>) -> bool {
debug x => _1; // in scope 0 at $DIR/not_equal_false.rs:3:8: 3:9
let mut _0: bool; // return place in scope 0 at $DIR/not_equal_false.rs:3:26: 3:30
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/not_equal_false.rs:4:17: 4:21
let mut _4: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
let mut _5: isize; // in scope 0 at $DIR/not_equal_false.rs:4:38: 4:45
let mut _6: isize; // in scope 0 at $DIR/not_equal_false.rs:4:17: 4:21
let mut _7: isize; // in scope 0 at $DIR/not_equal_false.rs:4:38: 4:45
let mut _8: bool; // in scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
bb0: {
StorageLive(_2); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
_3 = discriminant(_1); // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21
StorageLive(_6); // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21
_6 = move _3; // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21
_2 = Eq(_6, const 0_isize); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
StorageDead(_6); // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21
goto -> bb4; // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21
}
bb1: {
_0 = const true; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
goto -> bb3; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
}
bb2: {
StorageLive(_4); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
_5 = discriminant(_1); // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45
StorageLive(_7); // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45
_7 = move _5; // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45
_4 = Eq(_7, const 1_isize); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
StorageDead(_7); // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45
goto -> bb5; // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45
}
bb3: {
StorageDead(_4); // scope 0 at $DIR/not_equal_false.rs:4:45: 4:46
StorageDead(_2); // scope 0 at $DIR/not_equal_false.rs:4:45: 4:46
return; // scope 0 at $DIR/not_equal_false.rs:5:2: 5:2
}
bb4: {
switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
}
bb5: {
StorageLive(_8); // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
_8 = move _4; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
- _0 = Ne(_8, const false); // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
+ _0 = _8; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
StorageDead(_8); // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
goto -> bb3; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46
}
}