@@ -242,7 +242,9 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
242242 immediate_dominators[ * node] = Some ( pre_order_to_real[ idom[ idx] ] ) ;
243243 }
244244
245- Dominators { post_order_rank, immediate_dominators }
245+ let start_node = graph. start_node ( ) ;
246+ immediate_dominators[ start_node] = None ;
247+ Dominators { start_node, post_order_rank, immediate_dominators }
246248}
247249
248250/// Evaluate the link-eval virtual forest, providing the currently minimum semi
@@ -308,6 +310,7 @@ fn compress(
308310/// Tracks the list of dominators for each node.
309311#[ derive( Clone , Debug ) ]
310312pub struct Dominators < N : Idx > {
313+ start_node : N ,
311314 post_order_rank : IndexVec < N , usize > ,
312315 // Even though we track only the immediate dominator of each node, it's
313316 // possible to get its full list of dominators by looking up the dominator
@@ -316,14 +319,14 @@ pub struct Dominators<N: Idx> {
316319}
317320
318321impl < Node : Idx > Dominators < Node > {
319- /// Whether the given Node has an immediate dominator .
322+ /// Returns true if node is reachable from the start node .
320323 pub fn is_reachable ( & self , node : Node ) -> bool {
321- self . immediate_dominators [ node] . is_some ( )
324+ node == self . start_node || self . immediate_dominators [ node] . is_some ( )
322325 }
323326
324- pub fn immediate_dominator ( & self , node : Node ) -> Node {
325- assert ! ( self . is_reachable ( node ) , " node {node:?} is not reachable" ) ;
326- self . immediate_dominators [ node] . unwrap ( )
327+ /// Returns the immediate dominator of node, if any.
328+ pub fn immediate_dominator ( & self , node : Node ) -> Option < Node > {
329+ self . immediate_dominators [ node]
327330 }
328331
329332 /// Provides an iterator over each dominator up the CFG, for the given Node.
@@ -357,12 +360,7 @@ impl<'dom, Node: Idx> Iterator for Iter<'dom, Node> {
357360
358361 fn next ( & mut self ) -> Option < Self :: Item > {
359362 if let Some ( node) = self . node {
360- let dom = self . dominators . immediate_dominator ( node) ;
361- if dom == node {
362- self . node = None ; // reached the root
363- } else {
364- self . node = Some ( dom) ;
365- }
363+ self . node = self . dominators . immediate_dominator ( node) ;
366364 Some ( node)
367365 } else {
368366 None
0 commit comments