Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 8991002

Browse files
Remove separate RPO traversal
This integrates the preorder and postorder traversals into one.
1 parent 7d12767 commit 8991002

File tree

1 file changed

+7
-17
lines changed
  • compiler/rustc_data_structures/src/graph/dominators

1 file changed

+7
-17
lines changed

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

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,33 @@
44
//! "Linear-Time Algorithms for Dominators and Related Problems",
55
//! ftp://ftp.cs.princeton.edu/techreports/2005/737.pdf
66
7-
use super::iterate::reverse_post_order;
87
use super::ControlFlowGraph;
98
use rustc_index::vec::{Idx, IndexVec};
109
use std::cmp::Ordering;
1110

1211
#[cfg(test)]
1312
mod tests;
1413

15-
pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
16-
let start_node = graph.start_node();
17-
let rpo = reverse_post_order(&graph, start_node);
18-
dominators_given_rpo(graph, &rpo)
19-
}
20-
2114
struct PreOrderFrame<Node, Iter> {
2215
node: Node,
2316
iter: Iter,
2417
}
2518

26-
fn dominators_given_rpo<G: ControlFlowGraph>(graph: G, rpo: &[G::Node]) -> Dominators<G::Node> {
27-
let start_node = graph.start_node();
28-
assert_eq!(rpo[0], start_node);
29-
19+
pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
3020
// compute the post order index (rank) for each node
3121
let mut post_order_rank = IndexVec::from_elem_n(0, graph.num_nodes());
32-
for (index, node) in rpo.iter().rev().cloned().enumerate() {
33-
post_order_rank[node] = index;
34-
}
35-
3622
let mut visited = BitSet::new_empty(graph.num_nodes());
37-
let mut parent: IndexVec<usize, Option<usize>> = IndexVec::from_elem_n(None, rpo.len());
23+
let mut parent: IndexVec<usize, Option<usize>> = IndexVec::from_elem_n(None, graph.num_nodes());
3824

3925
let mut stack = vec![PreOrderFrame { node: 0, iter: graph.successors(graph.start_node()) }];
4026
visited.insert(graph.start_node());
41-
let mut pre_order_to_real = Vec::with_capacity(rpo.len());
27+
let mut pre_order_to_real = Vec::with_capacity(graph.num_nodes());
4228
let mut real_to_pre_order: IndexVec<G::Node, Option<usize>> =
4329
IndexVec::from_elem_n(None, graph.num_nodes());
4430
pre_order_to_real.push(graph.start_node());
4531
real_to_pre_order[graph.start_node()] = Some(0);
4632
let mut idx = 1;
33+
let mut post_order_idx = 0;
4734

4835
'recurse: while let Some(frame) = stack.last_mut() {
4936
while let Some(successor) = frame.iter.next() {
@@ -57,6 +44,9 @@ fn dominators_given_rpo<G: ControlFlowGraph>(graph: G, rpo: &[G::Node]) -> Domin
5744
continue 'recurse;
5845
}
5946
}
47+
post_order_rank[pre_order_to_real[frame.node]] = post_order_idx;
48+
post_order_idx += 1;
49+
6050
stack.pop();
6151
}
6252

0 commit comments

Comments
 (0)