Skip to content

Commit 345ada0

Browse files
Optimize: reuse the real-to-preorder mapping as the visited set
1 parent 8991002 commit 345ada0

File tree

1 file changed

+2
-4
lines changed
  • compiler/rustc_data_structures/src/graph/dominators

1 file changed

+2
-4
lines changed

compiler/rustc_data_structures/src/graph/dominators/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,9 @@ struct PreOrderFrame<Node, Iter> {
1919
pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
2020
// compute the post order index (rank) for each node
2121
let mut post_order_rank = IndexVec::from_elem_n(0, graph.num_nodes());
22-
let mut visited = BitSet::new_empty(graph.num_nodes());
2322
let mut parent: IndexVec<usize, Option<usize>> = IndexVec::from_elem_n(None, graph.num_nodes());
2423

2524
let mut stack = vec![PreOrderFrame { node: 0, iter: graph.successors(graph.start_node()) }];
26-
visited.insert(graph.start_node());
2725
let mut pre_order_to_real = Vec::with_capacity(graph.num_nodes());
2826
let mut real_to_pre_order: IndexVec<G::Node, Option<usize>> =
2927
IndexVec::from_elem_n(None, graph.num_nodes());
@@ -34,10 +32,10 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
3432

3533
'recurse: while let Some(frame) = stack.last_mut() {
3634
while let Some(successor) = frame.iter.next() {
37-
if visited.insert(successor) {
35+
if real_to_pre_order[successor].is_none() {
36+
real_to_pre_order[successor] = Some(idx);
3837
parent[idx] = Some(frame.node);
3938
pre_order_to_real.push(successor);
40-
real_to_pre_order[successor] = Some(idx);
4139

4240
stack.push(PreOrderFrame { node: idx, iter: graph.successors(successor) });
4341
idx += 1;

0 commit comments

Comments
 (0)