@@ -27,18 +27,19 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
27
27
IndexVec :: from_elem_n ( None , graph. num_nodes ( ) ) ;
28
28
pre_order_to_real. push ( graph. start_node ( ) ) ;
29
29
real_to_pre_order[ graph. start_node ( ) ] = Some ( 0 ) ;
30
- let mut idx = 1 ;
31
30
let mut post_order_idx = 0 ;
32
31
33
32
' recurse: while let Some ( frame) = stack. last_mut ( ) {
34
33
while let Some ( successor) = frame. iter . next ( ) {
35
34
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 ) ;
38
39
pre_order_to_real. push ( successor) ;
40
+ stack
41
+ . push ( PreOrderFrame { node : pre_order_idx, iter : graph. successors ( successor) } ) ;
39
42
40
- stack. push ( PreOrderFrame { node : idx, iter : graph. successors ( successor) } ) ;
41
- idx += 1 ;
42
43
continue ' recurse;
43
44
}
44
45
}
@@ -48,13 +49,15 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
48
49
stack. pop ( ) ;
49
50
}
50
51
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) ;
53
56
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 ) ;
55
58
let mut lastlinked = None ;
56
59
57
- for w in ( 1 ..pre_order_to_real . len ( ) ) . rev ( ) {
60
+ for w in ( 1 ..reachable_vertices ) . rev ( ) {
58
61
// Optimization: process buckets just once, at the start of the
59
62
// iteration. Do not explicitly empty the bucket (even though it will
60
63
// not be used again), to save some instructions.
@@ -84,7 +87,7 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
84
87
// processed elements; lastlinked represents the divider.
85
88
lastlinked = Some ( w) ;
86
89
}
87
- for w in 1 ..pre_order_to_real . len ( ) {
90
+ for w in 1 ..reachable_vertices {
88
91
if idom[ w] != semi[ w] {
89
92
idom[ w] = idom[ idom[ w] ] ;
90
93
}
0 commit comments