about summary refs log tree commit diff
path: root/src/librustc_mir/transform
diff options
context:
space:
mode:
authorCorey Farwell <coreyf@rwell.org>2017-12-03 17:43:48 -0500
committerGitHub <noreply@github.com>2017-12-03 17:43:48 -0500
commit94dbbacd45702d32c67c0d3be8d4874eadf300c8 (patch)
treee038092ff6aa90fae8b840d0b4976a3afe3e62ce /src/librustc_mir/transform
parent7c4f74d16e80a584a648425b9dec1b413d0584cf (diff)
parent17d6631c02a297b187d75817b4cfe4d2b3c6c9de (diff)
downloadrust-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.rs11
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
         }