1 "Adhoc/optimized routines for dominators."
3 def intersect(g
, i
, j
):
6 while finger1
!= finger2
:
7 while -g
[finger1
]["postno"] > -g
[finger2
]["postno"]:
8 finger1
= g
[finger1
]["idom"]
9 while -g
[finger2
]["postno"] > -g
[finger1
]["postno"]:
10 finger2
= g
[finger2
]["idom"]
16 for n
, info
in g
.nodes_props():
20 g
[entry
]["idom"] = entry
24 it
= iter(g
.iter_rev_postorder())
28 preds_rpo
= sorted([(-g
[p
]["postno"], p
) for p
in g
.pred(n
)])
29 new_idom
= preds_rpo
[0][1]
30 for _
, p
in preds_rpo
[1:]:
31 if g
[p
]["idom"] is not None:
32 new_idom
= intersect(g
, p
, new_idom
)
33 if g
[n
]["idom"] != new_idom
:
34 g
[n
]["idom"] = new_idom
37 g
[entry
]["idom"] = None