Avoid an intermediate Vec in mir simplify

This commit is contained in:
Markus Westerlind 2020-01-30 10:35:50 +01:00
parent dec8166abc
commit 33513fad80

View File

@ -94,7 +94,6 @@ pub fn simplify(mut self) {
self.strip_nops(); self.strip_nops();
let mut start = START_BLOCK; let mut start = START_BLOCK;
let mut new_stmts = vec![];
loop { loop {
let mut changed = false; let mut changed = false;
@ -119,13 +118,11 @@ pub fn simplify(mut self) {
while inner_changed { while inner_changed {
inner_changed = false; inner_changed = false;
inner_changed |= self.simplify_branch(&mut terminator); inner_changed |= self.simplify_branch(&mut terminator);
inner_changed |= self.merge_successor(&mut new_stmts, &mut terminator); inner_changed |= self.merge_successor(bb, &mut terminator);
changed |= inner_changed; changed |= inner_changed;
} }
let data = &mut self.basic_blocks[bb]; self.basic_blocks[bb].terminator = Some(terminator);
data.statements.append(&mut new_stmts);
data.terminator = Some(terminator);
changed |= inner_changed; changed |= inner_changed;
} }
@ -199,7 +196,7 @@ fn collapse_goto_chain(&mut self, start: &mut BasicBlock, changed: &mut bool) {
// merge a block with 1 `goto` predecessor to its parent // merge a block with 1 `goto` predecessor to its parent
fn merge_successor( fn merge_successor(
&mut self, &mut self,
new_stmts: &mut Vec<Statement<'tcx>>, merge_into: BasicBlock,
terminator: &mut Terminator<'tcx>, terminator: &mut Terminator<'tcx>,
) -> bool { ) -> bool {
let target = match terminator.kind { let target = match terminator.kind {
@ -216,7 +213,9 @@ fn merge_successor(
return false; return false;
} }
}; };
new_stmts.extend(self.basic_blocks[target].statements.drain(..));
let (from, to) = self.basic_blocks.pick2_mut(target, merge_into);
to.statements.append(&mut from.statements);
self.pred_count[target] = 0; self.pred_count[target] = 0;
true true