Previously copy propagation presumed that there is further unspecified distinction between move operands and copy operands in assignments and propagated moves from assignments into terminators. This is inconsistent with current operational semantics. Turn moves into copies after copy propagation to preserve existing behavior. Fixes https://github.com/rust-lang/rust/issues/137936. Fixes https://github.com/rust-lang/rust/issues/146423.
47 lines
1.1 KiB
Diff
47 lines
1.1 KiB
Diff
- // MIR for `remut` before CopyProp
|
|
+ // MIR for `remut` after CopyProp
|
|
|
|
fn remut(_1: u8) -> () {
|
|
debug x => _1;
|
|
let mut _0: ();
|
|
let _2: &mut u8;
|
|
let _5: ();
|
|
let mut _6: &mut u8;
|
|
scope 1 {
|
|
debug a => _2;
|
|
let _3: &mut u8;
|
|
scope 2 {
|
|
debug b => _3;
|
|
let _4: &mut u8;
|
|
scope 3 {
|
|
- debug c => _4;
|
|
+ debug c => _2;
|
|
}
|
|
}
|
|
}
|
|
|
|
bb0: {
|
|
- StorageLive(_2);
|
|
_2 = &mut _1;
|
|
StorageLive(_3);
|
|
_3 = &mut (*_2);
|
|
- StorageLive(_4);
|
|
- _4 = move _2;
|
|
StorageLive(_5);
|
|
- StorageLive(_6);
|
|
- _6 = move _4;
|
|
- _5 = opaque::<&mut u8>(move _6) -> [return: bb1, unwind continue];
|
|
+ _5 = opaque::<&mut u8>(copy _2) -> [return: bb1, unwind continue];
|
|
}
|
|
|
|
bb1: {
|
|
- StorageDead(_6);
|
|
StorageDead(_5);
|
|
_0 = const ();
|
|
- StorageDead(_4);
|
|
StorageDead(_3);
|
|
- StorageDead(_2);
|
|
return;
|
|
}
|
|
}
|
|
|