@@ -19,11 +19,9 @@ struct PreOrderFrame<Node, Iter> {
19
19
pub fn dominators < G : ControlFlowGraph > ( graph : G ) -> Dominators < G :: Node > {
20
20
// compute the post order index (rank) for each node
21
21
let mut post_order_rank = IndexVec :: from_elem_n ( 0 , graph. num_nodes ( ) ) ;
22
- let mut visited = BitSet :: new_empty ( graph. num_nodes ( ) ) ;
23
22
let mut parent: IndexVec < usize , Option < usize > > = IndexVec :: from_elem_n ( None , graph. num_nodes ( ) ) ;
24
23
25
24
let mut stack = vec ! [ PreOrderFrame { node: 0 , iter: graph. successors( graph. start_node( ) ) } ] ;
26
- visited. insert ( graph. start_node ( ) ) ;
27
25
let mut pre_order_to_real = Vec :: with_capacity ( graph. num_nodes ( ) ) ;
28
26
let mut real_to_pre_order: IndexVec < G :: Node , Option < usize > > =
29
27
IndexVec :: from_elem_n ( None , graph. num_nodes ( ) ) ;
@@ -34,10 +32,10 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
34
32
35
33
' recurse: while let Some ( frame) = stack. last_mut ( ) {
36
34
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) ;
38
37
parent[ idx] = Some ( frame. node ) ;
39
38
pre_order_to_real. push ( successor) ;
40
- real_to_pre_order[ successor] = Some ( idx) ;
41
39
42
40
stack. push ( PreOrderFrame { node : idx, iter : graph. successors ( successor) } ) ;
43
41
idx += 1 ;
0 commit comments