Skip to content

Commit

Permalink
feat: replace quadratic removal of rc instructions (#6705)
Browse files Browse the repository at this point in the history
  • Loading branch information
TomAFrench authored Dec 5, 2024
1 parent e9d3ccf commit 7619da5
Showing 1 changed file with 21 additions and 12 deletions.
33 changes: 21 additions & 12 deletions compiler/noirc_evaluator/src/ssa/opt/die.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//! Dead Instruction Elimination (DIE) pass: Removes any instruction without side-effects for
//! which the results are unused.
use fxhash::FxHashSet as HashSet;
use fxhash::{FxHashMap as HashMap, FxHashSet as HashSet};
use im::Vector;
use noirc_errors::Location;
use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator};
Expand Down Expand Up @@ -193,19 +193,28 @@ impl Context {
}

fn remove_rc_instructions(self, dfg: &mut DataFlowGraph) {
for (rc, block) in self.rc_instructions {
let value = match &dfg[rc] {
Instruction::IncrementRc { value } => *value,
Instruction::DecrementRc { value } => *value,
other => {
unreachable!("Expected IncrementRc or DecrementRc instruction, found {other:?}")
let unused_rc_values_by_block: HashMap<BasicBlockId, HashSet<InstructionId>> =
self.rc_instructions.into_iter().fold(HashMap::default(), |mut acc, (rc, block)| {
let value = match &dfg[rc] {
Instruction::IncrementRc { value } => *value,
Instruction::DecrementRc { value } => *value,
other => {
unreachable!(
"Expected IncrementRc or DecrementRc instruction, found {other:?}"
)
}
};

if !self.used_values.contains(&value) {
acc.entry(block).or_default().insert(rc);
}
};
acc
});

// This could be more efficient if we have to remove multiple instructions in a single block
if !self.used_values.contains(&value) {
dfg[block].instructions_mut().retain(|instruction| *instruction != rc);
}
for (block, instructions_to_remove) in unused_rc_values_by_block {
dfg[block]
.instructions_mut()
.retain(|instruction| !instructions_to_remove.contains(instruction));
}
}

Expand Down

0 comments on commit 7619da5

Please sign in to comment.