about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWesley Wiser <wwiser@gmail.com>2020-04-13 21:02:03 -0400
committerWesley Wiser <wwiser@gmail.com>2020-04-15 14:58:54 -0400
commitda8f3bbf32e6a67b1c1370465592776a1d999ad0 (patch)
tree55cd905c5552e63ca93cbdd78aa8b63f24f3d422
parentde3cf6e8a472bf67df278cfae8986afdcc215c18 (diff)
downloadrust-da8f3bbf32e6a67b1c1370465592776a1d999ad0.tar.gz
rust-da8f3bbf32e6a67b1c1370465592776a1d999ad0.zip
Directly modify the `used_locals` vec
Fixes perf regression in `optimized_mir` query
-rw-r--r--src/librustc_mir/transform/simplify.rs26
1 files changed, 12 insertions, 14 deletions
diff --git a/src/librustc_mir/transform/simplify.rs b/src/librustc_mir/transform/simplify.rs
index 31d902bef1d..45e2e0c2596 100644
--- a/src/librustc_mir/transform/simplify.rs
+++ b/src/librustc_mir/transform/simplify.rs
@@ -438,13 +438,16 @@ impl<'a, 'tcx> Visitor<'tcx> for DeclMarker<'a, 'tcx> {
 }
 
 struct StatementDeclMarker<'a, 'tcx> {
-    used_locals: IndexVec<Local, usize>,
+    used_locals: &'a mut IndexVec<Local, usize>,
     statement: &'a Statement<'tcx>,
 }
 
 impl<'a, 'tcx> StatementDeclMarker<'a, 'tcx> {
-    pub fn new(local_count: usize, statement: &'a Statement<'tcx>) -> Self {
-        Self { used_locals: IndexVec::from_elem_n(0, local_count), statement }
+    pub fn new(
+        used_locals: &'a mut IndexVec<Local, usize>,
+        statement: &'a Statement<'tcx>,
+    ) -> Self {
+        Self { used_locals, statement }
     }
 }
 
@@ -457,7 +460,11 @@ impl<'a, 'tcx> Visitor<'tcx> for StatementDeclMarker<'a, 'tcx> {
             }
         }
 
-        self.used_locals[*local] += 1;
+        let use_count = &mut self.used_locals[*local];
+        // If this is the local we're removing...
+        if *use_count != 0 {
+            *use_count -= 1;
+        }
     }
 }
 
@@ -504,17 +511,8 @@ impl<'a, 'tcx> MutVisitor<'tcx> for RemoveStatements<'a, 'tcx> {
                 trace!("removing statement {:?}", stmt);
                 self.modified = true;
 
-                let mut visitor = StatementDeclMarker::new(self.used_locals.len(), stmt);
+                let mut visitor = StatementDeclMarker::new(self.used_locals, stmt);
                 visitor.visit_statement(stmt, Location { block, statement_index: i });
-
-                for (local, count) in visitor.used_locals.iter_enumerated() {
-                    let used_count = &mut self.used_locals[local];
-
-                    // If this is the local we're removing...
-                    if *used_count != 0 {
-                        *used_count -= count;
-                    }
-                }
             }
 
             i += 1;