diff options
| author | Corey Farwell <coreyf@rwell.org> | 2017-12-03 17:43:48 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-12-03 17:43:48 -0500 |
| commit | 94dbbacd45702d32c67c0d3be8d4874eadf300c8 (patch) | |
| tree | e038092ff6aa90fae8b840d0b4976a3afe3e62ce /src/librustc_mir/transform | |
| parent | 7c4f74d16e80a584a648425b9dec1b413d0584cf (diff) | |
| parent | 17d6631c02a297b187d75817b4cfe4d2b3c6c9de (diff) | |
| download | rust-94dbbacd45702d32c67c0d3be8d4874eadf300c8.tar.gz rust-94dbbacd45702d32c67c0d3be8d4874eadf300c8.zip | |
Rollup merge of #46462 - sinkuu:copyprop_reg2, r=arielb1
Fix CopyPropagation regression (2)
Remaining part of MIR copyprop regression by (I think) #45380, which I missed in #45753.
```rust
fn foo(mut x: i32) -> i32 {
let y = x;
x = 123; // `x` is assigned only once in MIR, but cannot be propagated to `y`
y
}
```
So any assignment to an argument cannot be propagated.
Diffstat (limited to 'src/librustc_mir/transform')
| -rw-r--r-- | src/librustc_mir/transform/copy_prop.rs | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/librustc_mir/transform/copy_prop.rs b/src/librustc_mir/transform/copy_prop.rs index 6047b4e174a..95fe99a1bec 100644 --- a/src/librustc_mir/transform/copy_prop.rs +++ b/src/librustc_mir/transform/copy_prop.rs @@ -239,10 +239,13 @@ impl<'tcx> Action<'tcx> { // USE(SRC); let src_def_count = src_use_info.def_count_not_including_drop(); // allow function arguments to be propagated - if src_def_count > 1 || - (src_def_count == 0 && mir.local_kind(src_local) != LocalKind::Arg) { - debug!(" Can't copy-propagate local: {} defs of src", - src_use_info.def_count_not_including_drop()); + let is_arg = mir.local_kind(src_local) == LocalKind::Arg; + if (is_arg && src_def_count != 0) || (!is_arg && src_def_count != 1) { + debug!( + " Can't copy-propagate local: {} defs of src{}", + src_def_count, + if is_arg { " (argument)" } else { "" }, + ); return None } |
