diff options
author | bors <bors@rust-lang.org> | 2023-05-16 22:27:08 +0000 |
---|---|---|
committer | bors <bors@rust-lang.org> | 2023-05-16 22:27:08 +0000 |
commit | 5c3a3362f86f9748b4a6cb18b147893774a189ac (patch) | |
tree | 03ee6438dea2a1eaf45effde66dbfa077f68e3de /compiler/rustc_mir_transform/src/copy_prop.rs | |
parent | e77366b57b799dfa3ce1fcb850c068723a3213ee (diff) | |
parent | adfffc7e123a0cca1fefdfc48a7c7860a428c7f4 (diff) | |
download | rust-5c3a3362f86f9748b4a6cb18b147893774a189ac.tar.gz |
Auto merge of #111556 - cjgillot:copy-prop-nrvo, r=oli-obk
Merge return place with other locals in CopyProp.
This reintroduces a limited form of NRVO.
r? wg-mir-opt
Diffstat (limited to 'compiler/rustc_mir_transform/src/copy_prop.rs')
-rw-r--r-- | compiler/rustc_mir_transform/src/copy_prop.rs | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/compiler/rustc_mir_transform/src/copy_prop.rs b/compiler/rustc_mir_transform/src/copy_prop.rs index c565d6f13b1..319f3a79705 100644 --- a/compiler/rustc_mir_transform/src/copy_prop.rs +++ b/compiler/rustc_mir_transform/src/copy_prop.rs @@ -162,20 +162,22 @@ impl<'tcx> MutVisitor<'tcx> for Replacer<'_, 'tcx> { } fn visit_statement(&mut self, stmt: &mut Statement<'tcx>, loc: Location) { - match stmt.kind { - // When removing storage statements, we need to remove both (#107511). - StatementKind::StorageLive(l) | StatementKind::StorageDead(l) - if self.storage_to_remove.contains(l) => - { - stmt.make_nop() - } - StatementKind::Assign(box (ref place, ref mut rvalue)) - if place.as_local().is_some() => - { - // Do not replace assignments. - self.visit_rvalue(rvalue, loc) - } - _ => self.super_statement(stmt, loc), + // When removing storage statements, we need to remove both (#107511). + if let StatementKind::StorageLive(l) | StatementKind::StorageDead(l) = stmt.kind + && self.storage_to_remove.contains(l) + { + stmt.make_nop(); + return + } + + self.super_statement(stmt, loc); + + // Do not leave tautological assignments around. + if let StatementKind::Assign(box (lhs, ref rhs)) = stmt.kind + && let Rvalue::Use(Operand::Copy(rhs) | Operand::Move(rhs)) | Rvalue::CopyForDeref(rhs) = *rhs + && lhs == rhs + { + stmt.make_nop(); } } } |