@@ -19,11 +19,9 @@ struct PreOrderFrame<Node, Iter> {
1919pub 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