14
14
//! Rice Computer Science TS-06-33870
15
15
//! <https://www.cs.rice.edu/~keith/EMBED/dom.pdf>
16
16
17
- use super :: ControlFlowGraph ;
17
+ use super :: super :: indexed_vec :: { Idx , IndexVec } ;
18
18
use super :: iterate:: reverse_post_order;
19
- use super :: super :: indexed_vec :: { IndexVec , Idx } ;
19
+ use super :: ControlFlowGraph ;
20
20
21
21
use std:: fmt;
22
22
@@ -29,15 +29,16 @@ pub fn dominators<G: ControlFlowGraph>(graph: &G) -> Dominators<G::Node> {
29
29
dominators_given_rpo ( graph, & rpo)
30
30
}
31
31
32
- pub fn dominators_given_rpo < G : ControlFlowGraph > ( graph : & G ,
33
- rpo : & [ G :: Node ] )
34
- -> Dominators < G :: Node > {
32
+ pub fn dominators_given_rpo < G : ControlFlowGraph > (
33
+ graph : & G ,
34
+ rpo : & [ G :: Node ] ,
35
+ ) -> Dominators < G :: Node > {
35
36
let start_node = graph. start_node ( ) ;
36
37
assert_eq ! ( rpo[ 0 ] , start_node) ;
37
38
38
39
// compute the post order index (rank) for each node
39
- let mut post_order_rank: IndexVec < G :: Node , usize > = IndexVec :: from_elem_n ( usize :: default ( ) ,
40
- graph. num_nodes ( ) ) ;
40
+ let mut post_order_rank: IndexVec < G :: Node , usize > =
41
+ IndexVec :: from_elem_n ( usize :: default ( ) , graph. num_nodes ( ) ) ;
41
42
for ( index, node) in rpo. iter ( ) . rev ( ) . cloned ( ) . enumerate ( ) {
42
43
post_order_rank[ node] = index;
43
44
}
@@ -56,10 +57,12 @@ pub fn dominators_given_rpo<G: ControlFlowGraph>(graph: &G,
56
57
if immediate_dominators[ pred] . is_some ( ) {
57
58
// (*)
58
59
// (*) dominators for `pred` have been calculated
59
- new_idom = intersect_opt ( & post_order_rank,
60
- & immediate_dominators,
61
- new_idom,
62
- Some ( pred) ) ;
60
+ new_idom = intersect_opt (
61
+ & post_order_rank,
62
+ & immediate_dominators,
63
+ new_idom,
64
+ Some ( pred) ,
65
+ ) ;
63
66
}
64
67
}
65
68
@@ -76,23 +79,25 @@ pub fn dominators_given_rpo<G: ControlFlowGraph>(graph: &G,
76
79
}
77
80
}
78
81
79
- fn intersect_opt < Node : Idx > ( post_order_rank : & IndexVec < Node , usize > ,
80
- immediate_dominators : & IndexVec < Node , Option < Node > > ,
81
- node1 : Option < Node > ,
82
- node2 : Option < Node > )
83
- -> Option < Node > {
82
+ fn intersect_opt < Node : Idx > (
83
+ post_order_rank : & IndexVec < Node , usize > ,
84
+ immediate_dominators : & IndexVec < Node , Option < Node > > ,
85
+ node1 : Option < Node > ,
86
+ node2 : Option < Node > ,
87
+ ) -> Option < Node > {
84
88
match ( node1, node2) {
85
89
( None , None ) => None ,
86
90
( Some ( n) , None ) | ( None , Some ( n) ) => Some ( n) ,
87
91
( Some ( n1) , Some ( n2) ) => Some ( intersect ( post_order_rank, immediate_dominators, n1, n2) ) ,
88
92
}
89
93
}
90
94
91
- fn intersect < Node : Idx > ( post_order_rank : & IndexVec < Node , usize > ,
92
- immediate_dominators : & IndexVec < Node , Option < Node > > ,
93
- mut node1 : Node ,
94
- mut node2 : Node )
95
- -> Node {
95
+ fn intersect < Node : Idx > (
96
+ post_order_rank : & IndexVec < Node , usize > ,
97
+ immediate_dominators : & IndexVec < Node , Option < Node > > ,
98
+ mut node1 : Node ,
99
+ mut node2 : Node ,
100
+ ) -> Node {
96
101
while node1 != node2 {
97
102
while post_order_rank[ node1] < post_order_rank[ node2] {
98
103
node1 = immediate_dominators[ node1] . unwrap ( ) ;
@@ -176,11 +181,13 @@ impl<Node: Idx> DominatorTree<Node> {
176
181
177
182
impl < Node : Idx > fmt:: Debug for DominatorTree < Node > {
178
183
fn fmt ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
179
- fmt:: Debug :: fmt ( & DominatorTreeNode {
180
- tree : self ,
181
- node : self . root ,
182
- } ,
183
- fmt)
184
+ fmt:: Debug :: fmt (
185
+ & DominatorTreeNode {
186
+ tree : self ,
187
+ node : self . root ,
188
+ } ,
189
+ fmt,
190
+ )
184
191
}
185
192
}
186
193
@@ -194,11 +201,9 @@ impl<'tree, Node: Idx> fmt::Debug for DominatorTreeNode<'tree, Node> {
194
201
let subtrees: Vec < _ > = self . tree
195
202
. children ( self . node )
196
203
. iter ( )
197
- . map ( |& child| {
198
- DominatorTreeNode {
199
- tree : self . tree ,
200
- node : child,
201
- }
204
+ . map ( |& child| DominatorTreeNode {
205
+ tree : self . tree ,
206
+ node : child,
202
207
} )
203
208
. collect ( ) ;
204
209
fmt. debug_tuple ( "" )
0 commit comments