@@ -27,18 +27,19 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
2727 IndexVec :: from_elem_n ( None , graph. num_nodes ( ) ) ;
2828 pre_order_to_real. push ( graph. start_node ( ) ) ;
2929 real_to_pre_order[ graph. start_node ( ) ] = Some ( 0 ) ;
30- let mut idx = 1 ;
3130 let mut post_order_idx = 0 ;
3231
3332 ' recurse: while let Some ( frame) = stack. last_mut ( ) {
3433 while let Some ( successor) = frame. iter . next ( ) {
3534 if real_to_pre_order[ successor] . is_none ( ) {
36- real_to_pre_order[ successor] = Some ( idx) ;
37- parent[ idx] = Some ( frame. node ) ;
35+ let pre_order_idx = pre_order_to_real. len ( ) ;
36+
37+ real_to_pre_order[ successor] = Some ( pre_order_idx) ;
38+ parent[ pre_order_idx] = Some ( frame. node ) ;
3839 pre_order_to_real. push ( successor) ;
40+ stack
41+ . push ( PreOrderFrame { node : pre_order_idx, iter : graph. successors ( successor) } ) ;
3942
40- stack. push ( PreOrderFrame { node : idx, iter : graph. successors ( successor) } ) ;
41- idx += 1 ;
4243 continue ' recurse;
4344 }
4445 }
@@ -48,13 +49,15 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
4849 stack. pop ( ) ;
4950 }
5051
51- let mut idom = IndexVec :: from_elem_n ( 0 , pre_order_to_real. len ( ) ) ;
52- let mut semi = IndexVec :: from_fn_n ( std:: convert:: identity, pre_order_to_real. len ( ) ) ;
52+ let reachable_vertices = pre_order_to_real. len ( ) ;
53+
54+ let mut idom = IndexVec :: from_elem_n ( 0 , reachable_vertices) ;
55+ let mut semi = IndexVec :: from_fn_n ( std:: convert:: identity, reachable_vertices) ;
5356 let mut label = semi. clone ( ) ;
54- let mut bucket = IndexVec :: from_elem_n ( vec ! [ ] , pre_order_to_real . len ( ) ) ;
57+ let mut bucket = IndexVec :: from_elem_n ( vec ! [ ] , reachable_vertices ) ;
5558 let mut lastlinked = None ;
5659
57- for w in ( 1 ..pre_order_to_real . len ( ) ) . rev ( ) {
60+ for w in ( 1 ..reachable_vertices ) . rev ( ) {
5861 // Optimization: process buckets just once, at the start of the
5962 // iteration. Do not explicitly empty the bucket (even though it will
6063 // not be used again), to save some instructions.
@@ -84,7 +87,7 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
8487 // processed elements; lastlinked represents the divider.
8588 lastlinked = Some ( w) ;
8689 }
87- for w in 1 ..pre_order_to_real . len ( ) {
90+ for w in 1 ..reachable_vertices {
8891 if idom[ w] != semi[ w] {
8992 idom[ w] = idom[ idom[ w] ] ;
9093 }
0 commit comments