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;
87use super :: ControlFlowGraph ;
98use rustc_index:: vec:: { Idx , IndexVec } ;
109use std:: cmp:: Ordering ;
1110
1211#[ cfg( test) ]
1312mod 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-
2114struct 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