about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2025-06-21 15:21:05 +0200
committerTomasz Miąsko <tomasz.miasko@gmail.com>2025-06-22 14:30:23 +0200
commitc35353910918eb40c814291996c585aababe0ea9 (patch)
treef974b017f69822961c879ec84738d2836ef830e9
parent9972ebfcc2b1ab322dc6611c1c997344078e05cd (diff)
downloadrust-c35353910918eb40c814291996c585aababe0ea9.tar.gz
rust-c35353910918eb40c814291996c585aababe0ea9.zip
Leave from CopyProp early when there are no replacements
-rw-r--r--compiler/rustc_mir_transform/src/copy_prop.rs18
1 files changed, 10 insertions, 8 deletions
diff --git a/compiler/rustc_mir_transform/src/copy_prop.rs b/compiler/rustc_mir_transform/src/copy_prop.rs
index fe78a104fa0..cddeefca681 100644
--- a/compiler/rustc_mir_transform/src/copy_prop.rs
+++ b/compiler/rustc_mir_transform/src/copy_prop.rs
@@ -33,24 +33,26 @@ impl<'tcx> crate::MirPass<'tcx> for CopyProp {
         debug!(borrowed_locals = ?ssa.borrowed_locals());
         debug!(copy_classes = ?ssa.copy_classes());
 
-        let fully_moved = fully_moved_locals(&ssa, body);
-        debug!(?fully_moved);
-
-        let mut storage_to_remove = DenseBitSet::new_empty(fully_moved.domain_size());
+        let mut any_replacement = false;
+        let mut storage_to_remove = DenseBitSet::new_empty(body.local_decls.len());
         for (local, &head) in ssa.copy_classes().iter_enumerated() {
             if local != head {
+                any_replacement = true;
                 storage_to_remove.insert(head);
             }
         }
 
-        let any_replacement = ssa.copy_classes().iter_enumerated().any(|(l, &h)| l != h);
+        if !any_replacement {
+            return;
+        }
+
+        let fully_moved = fully_moved_locals(&ssa, body);
+        debug!(?fully_moved);
 
         Replacer { tcx, copy_classes: ssa.copy_classes(), fully_moved, storage_to_remove }
             .visit_body_preserves_cfg(body);
 
-        if any_replacement {
-            crate::simplify::remove_unused_definitions(body);
-        }
+        crate::simplify::remove_unused_definitions(body);
     }
 
     fn is_required(&self) -> bool {