Auto merge of #81470 - tmiasko:remove-allocations, r=matthewjasper

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.
This commit is contained in:
bors 2021-01-29 13:10:09 +00:00
commit b122908617

View File

@ -28,7 +28,6 @@
//! return. //! return.
use crate::transform::MirPass; use crate::transform::MirPass;
use rustc_index::bit_set::BitSet;
use rustc_index::vec::{Idx, IndexVec}; use rustc_index::vec::{Idx, IndexVec};
use rustc_middle::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor}; use rustc_middle::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor};
use rustc_middle::mir::*; use rustc_middle::mir::*;
@ -288,17 +287,17 @@ impl<'a, 'tcx> CfgSimplifier<'a, 'tcx> {
} }
pub fn remove_dead_blocks(body: &mut Body<'_>) { pub fn remove_dead_blocks(body: &mut Body<'_>) {
let mut seen = BitSet::new_empty(body.basic_blocks().len()); let reachable = traversal::reachable_as_bitset(body);
for (bb, _) in traversal::preorder(body) { let num_blocks = body.basic_blocks().len();
seen.insert(bb.index()); if num_blocks == reachable.count() {
return;
} }
let basic_blocks = body.basic_blocks_mut(); 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 replacements: Vec<_> = (0..num_blocks).map(BasicBlock::new).collect();
let mut used_blocks = 0; 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); replacements[alive_index] = BasicBlock::new(used_blocks);
if alive_index != used_blocks { if alive_index != used_blocks {
// Swap the next alive block data with the current available slot. Since // Swap the next alive block data with the current available slot. Since