Skip to content

Commit 94dbbac

Browse files
authored
Rollup merge of rust-lang#46462 - sinkuu:copyprop_reg2, r=arielb1
Fix CopyPropagation regression (2) Remaining part of MIR copyprop regression by (I think) rust-lang#45380, which I missed in rust-lang#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.
2 parents 7c4f74d + 17d6631 commit 94dbbac

File tree

2 files changed

+57
-30
lines changed

2 files changed

+57
-30
lines changed

src/librustc_mir/transform/copy_prop.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,13 @@ impl<'tcx> Action<'tcx> {
239239
// USE(SRC);
240240
let src_def_count = src_use_info.def_count_not_including_drop();
241241
// allow function arguments to be propagated
242-
if src_def_count > 1 ||
243-
(src_def_count == 0 && mir.local_kind(src_local) != LocalKind::Arg) {
244-
debug!(" Can't copy-propagate local: {} defs of src",
245-
src_use_info.def_count_not_including_drop());
242+
let is_arg = mir.local_kind(src_local) == LocalKind::Arg;
243+
if (is_arg && src_def_count != 0) || (!is_arg && src_def_count != 1) {
244+
debug!(
245+
" Can't copy-propagate local: {} defs of src{}",
246+
src_def_count,
247+
if is_arg { " (argument)" } else { "" },
248+
);
246249
return None
247250
}
248251

src/test/mir-opt/copy_propagation_arg.rs

+50-26
Original file line numberDiff line numberDiff line change
@@ -30,42 +30,43 @@ fn baz(mut x: i32) {
3030
x = x;
3131
}
3232

33+
fn arg_src(mut x: i32) -> i32 {
34+
let y = x;
35+
x = 123; // Don't propagate this assignment to `y`
36+
y
37+
}
38+
3339
fn main() {
3440
// Make sure the function actually gets instantiated.
3541
foo(0);
3642
bar(0);
3743
baz(0);
44+
arg_src(0);
3845
}
3946

4047
// END RUST SOURCE
4148
// START rustc.foo.CopyPropagation.before.mir
4249
// bb0: {
43-
// StorageLive(_2);
44-
// StorageLive(_3);
50+
// ...
4551
// _3 = _1;
4652
// _2 = const dummy(move _3) -> bb1;
4753
// }
4854
// bb1: {
49-
// StorageDead(_3);
55+
// ...
5056
// _1 = move _2;
51-
// StorageDead(_2);
52-
// _0 = ();
53-
// return;
57+
// ...
5458
// }
5559
// END rustc.foo.CopyPropagation.before.mir
5660
// START rustc.foo.CopyPropagation.after.mir
5761
// bb0: {
58-
// StorageLive(_2);
59-
// nop;
60-
// nop;
61-
// _2 = const dummy(move _1) -> bb1;
62+
// ...
63+
// _3 = _1;
64+
// _2 = const dummy(move _3) -> bb1;
6265
// }
6366
// bb1: {
64-
// nop;
67+
// ...
6568
// _1 = move _2;
66-
// StorageDead(_2);
67-
// _0 = ();
68-
// return;
69+
// ...
6970
// }
7071
// END rustc.foo.CopyPropagation.after.mir
7172
// START rustc.bar.CopyPropagation.before.mir
@@ -83,15 +84,14 @@ fn main() {
8384
// END rustc.bar.CopyPropagation.before.mir
8485
// START rustc.bar.CopyPropagation.after.mir
8586
// bb0: {
86-
// nop;
87-
// nop;
88-
// _2 = const dummy(move _1) -> bb1;
87+
// ...
88+
// _3 = _1;
89+
// _2 = const dummy(move _3) -> bb1;
8990
// }
9091
// bb1: {
91-
// nop;
92+
// ...
9293
// _1 = const 5u8;
93-
// _0 = ();
94-
// return;
94+
// ...
9595
// }
9696
// END rustc.bar.CopyPropagation.after.mir
9797
// START rustc.baz.CopyPropagation.before.mir
@@ -106,11 +106,35 @@ fn main() {
106106
// END rustc.baz.CopyPropagation.before.mir
107107
// START rustc.baz.CopyPropagation.after.mir
108108
// bb0: {
109-
// nop;
110-
// nop;
111-
// nop;
112-
// nop;
113-
// _0 = ();
114-
// return;
109+
// ...
110+
// _2 = _1;
111+
// _1 = move _2;
112+
// ...
115113
// }
116114
// END rustc.baz.CopyPropagation.after.mir
115+
// START rustc.arg_src.CopyPropagation.before.mir
116+
// bb0: {
117+
// ...
118+
// _3 = _1;
119+
// _2 = move _3;
120+
// ...
121+
// _1 = const 123i32;
122+
// ...
123+
// _4 = _2;
124+
// _0 = move _4;
125+
// ...
126+
// return;
127+
// }
128+
// END rustc.arg_src.CopyPropagation.before.mir
129+
// START rustc.arg_src.CopyPropagation.after.mir
130+
// bb0: {
131+
// ...
132+
// _3 = _1;
133+
// ...
134+
// _1 = const 123i32;
135+
// ...
136+
// _0 = move _3;
137+
// ...
138+
// return;
139+
// }
140+
// END rustc.arg_src.CopyPropagation.after.mir

0 commit comments

Comments
 (0)