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.
59 lines
3.5 KiB
Diff
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
|
|
}
|
|
}
|
|
|