about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Holk <ericholk@microsoft.com>2021-12-16 15:46:56 -0800
committerEric Holk <ericholk@microsoft.com>2022-01-18 14:25:29 -0800
commit7d11b336f3ee9d65ba82b86d73cf9bc9fb174269 (patch)
tree57cd1c3c99f7cf318d57897ee8bb8bee9899457c
parenta7df4e8d2f89379fb0b620cb0267f97c05bc1598 (diff)
downloadrust-7d11b336f3ee9d65ba82b86d73cf9bc9fb174269.tar.gz
rust-7d11b336f3ee9d65ba82b86d73cf9bc9fb174269.zip
Remove clones and most allocations from propagate_to_fixpoint
-rw-r--r--compiler/rustc_typeck/src/check/generator_interior/drop_ranges/cfg_propagate.rs12
1 files changed, 6 insertions, 6 deletions
diff --git a/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/cfg_propagate.rs b/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/cfg_propagate.rs
index 22f7484abf3..a540812f4a3 100644
--- a/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/cfg_propagate.rs
+++ b/compiler/rustc_typeck/src/check/generator_interior/drop_ranges/cfg_propagate.rs
@@ -9,16 +9,17 @@ impl DropRangesBuilder {
 
         trace!("predecessors: {:#?}", preds.iter_enumerated().collect::<BTreeMap<_, _>>());
 
+        let mut new_state = BitSet::new_empty(self.num_values());
+
         let mut propagate = || {
             let mut changed = false;
             for id in self.nodes.indices() {
-                let old_state = self.nodes[id].drop_state.clone();
-                let mut new_state = if id.index() == 0 {
-                    BitSet::new_empty(self.num_values())
+                if id.index() == 0 {
+                    new_state.clear();
                 } else {
                     // If we are not the start node and we have no predecessors, treat
                     // everything as dropped because there's no way to get here anyway.
-                    BitSet::new_filled(self.num_values())
+                    new_state.insert_all();
                 };
 
                 for pred in &preds[id] {
@@ -34,8 +35,7 @@ impl DropRangesBuilder {
                     new_state.remove(*reinit);
                 }
 
-                changed |= old_state != new_state;
-                self.nodes[id].drop_state = new_state;
+                changed |= self.nodes[id].drop_state.intersect(&new_state);
             }
 
             changed