From 7f05090012eb6fcd152b5c71f2ebc4592f70ce41 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 6 Oct 2026 08:14:27 +0000 Subject: [PATCH] perf: optimize DominatorAnalysis inner loop to prevent HashSet clones Replaced a costly `all_blocks.clone()` and `.intersection().cloned().collect()` combination with a significantly more efficient `Option` and `.retain()` approach. This calculates dataflow intersection in-place and avoids allocating large memory sets on every iteration for nodes with initialized predecessors. Co-authored-by: Tcode-Motion <188012755+Tcode-Motion@users.noreply.github.com> --- compiler/optimizer/src/analysis/dominators.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler/optimizer/src/analysis/dominators.rs b/compiler/optimizer/src/analysis/dominators.rs index 221fe53e..8e5c3f84 100644 --- a/compiler/optimizer/src/analysis/dominators.rs +++ b/compiler/optimizer/src/analysis/dominators.rs @@ -41,12 +41,19 @@ impl DominatorAnalysis { continue; } - let mut new_dom = all_blocks.clone(); + let mut new_dom: Option> = None; for &pred in &block.predecessors { if let Some(pred_doms) = dominators.get(&pred) { - new_dom = new_dom.intersection(pred_doms).cloned().collect(); + if let Some(mut current_dom) = new_dom.take() { + current_dom.retain(|x| pred_doms.contains(x)); + new_dom = Some(current_dom); + } else { + new_dom = Some(pred_doms.clone()); + } } } + + let mut new_dom = new_dom.unwrap_or_else(|| all_blocks.clone()); new_dom.insert(block.id); if let Some(old_doms) = dominators.get_mut(&block.id) {