From 8237893113ac15fd99cc2e0ab95b7a4ffe81079f Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 1 Sep 2017 12:50:51 -0700 Subject: [PATCH] Eliminate a temporary heap allocation when splitting a critical edge. --- lib/frontend/src/ssa.rs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/frontend/src/ssa.rs b/lib/frontend/src/ssa.rs index a1b9d56de9..2cabe2cedf 100644 --- a/lib/frontend/src/ssa.rs +++ b/lib/frontend/src/ssa.rs @@ -539,24 +539,15 @@ where // In the case of a jump table, the situation is tricky because br_table doesn't // support arguments. // We have to split the critical edge - let indexes: Vec = jts[jt].entries().fold( - Vec::new(), - |mut acc, (index, dest)| if dest == - dest_ebb - { - acc.push(index); - acc - } else { - acc - }, - ); let middle_ebb = dfg.make_ebb(); layout.append_ebb(middle_ebb); let block = self.declare_ebb_header_block(middle_ebb); self.blocks[block].add_predecessor(jump_inst_block, jump_inst); self.seal_ebb_header_block(middle_ebb, dfg, layout, jts); - for index in indexes { - jts[jt].set_entry(index, middle_ebb) + for old_dest in jts[jt].as_mut_slice() { + if old_dest.unwrap() == dest_ebb { + *old_dest = PackedOption::from(middle_ebb); + } } let mut cur = Cursor::new(layout); cur.goto_bottom(middle_ebb);