about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTomasz Miąsko <tomasz.miasko@gmail.com>2021-01-28 00:00:00 +0000
committerTomasz Miąsko <tomasz.miasko@gmail.com>2021-01-28 00:00:00 +0000
commitdc6ec3596b7a08c66ee3e98ca6996536ef742121 (patch)
treee7ad02205aef16d7c8cbb75ceeda77a6008961bc
parent0e190206e2ff0c13d64701d9b4145bf89a2d0cab (diff)
downloadrust-dc6ec3596b7a08c66ee3e98ca6996536ef742121.tar.gz
rust-dc6ec3596b7a08c66ee3e98ca6996536ef742121.zip
Avoid memory allocation when removing dead blocks
Use `reachable_as_bitset` to reuse a bitset from the traversal rather
than allocating it seprately. Additionally check if there are any
unreachable blocks before proceeding.
-rw-r--r--compiler/rustc_mir/src/transform/simplify.rs13
1 files changed, 6 insertions, 7 deletions
diff --git a/compiler/rustc_mir/src/transform/simplify.rs b/compiler/rustc_mir/src/transform/simplify.rs
index 289231e52cb..11539d3ef30 100644
--- a/compiler/rustc_mir/src/transform/simplify.rs
+++ b/compiler/rustc_mir/src/transform/simplify.rs
@@ -28,7 +28,6 @@
 //! return.
 
 use crate::transform::MirPass;
-use rustc_index::bit_set::BitSet;
 use rustc_index::vec::{Idx, IndexVec};
 use rustc_middle::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor};
 use rustc_middle::mir::*;
@@ -288,17 +287,17 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
 }
 
 pub fn remove_dead_blocks(body: &mut Body<'_>) {
-    let mut seen = BitSet::new_empty(body.basic_blocks().len());
-    for (bb, _) in traversal::preorder(body) {
-        seen.insert(bb.index());
+    let reachable = traversal::reachable_as_bitset(body);
+    let num_blocks = body.basic_blocks().len();
+    if num_blocks == reachable.count() {
+        return;
     }
 
     let basic_blocks = body.basic_blocks_mut();
-
-    let num_blocks = basic_blocks.len();
     let mut replacements: Vec<_> = (0..num_blocks).map(BasicBlock::new).collect();
     let mut used_blocks = 0;
-    for alive_index in seen.iter() {
+    for alive_index in reachable.iter() {
+        let alive_index = alive_index.index();
         replacements[alive_index] = BasicBlock::new(used_blocks);
         if alive_index != used_blocks {
             // Swap the next alive block data with the current available slot. Since