Skip to content

Commit

Permalink
feat: replace quadratic removal of rc instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
TomAFrench committed Dec 5, 2024
1 parent 5b0b721 commit 0edd360
Showing 1 changed file with 20 additions and 11 deletions.
31 changes: 20 additions & 11 deletions noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/die.rs
Original file line number Diff line number Diff line change
Expand Up @@ -201,19 +201,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 0edd360

Please sign in to comment.