@@ -72,6 +72,14 @@ fn dominators_given_rpo<G: ControlFlowGraph>(graph: G, rpo: &[G::Node]) -> Domin
72
72
let mut lastlinked = None ;
73
73
74
74
for & w in pre_order_nodes[ 1 ..] . iter ( ) . rev ( ) {
75
+ // Optimization: process buckets just once. We need not explicitly empty
76
+ // the bucket here, but mem::take is pretty cheap.
77
+ let z = parent[ w] . unwrap ( ) ;
78
+ for v in std:: mem:: take ( & mut bucket[ z] ) {
79
+ let y = eval ( & pre_order_index, & mut parent, lastlinked, & semi, & mut label, v) ;
80
+ idom[ v] = if pre_order_index[ semi[ y] ] < pre_order_index[ z] { y } else { z } ;
81
+ }
82
+
75
83
semi[ w] = w;
76
84
for v in graph. predecessors ( w) {
77
85
let x = eval ( & pre_order_index, & mut parent, lastlinked, & semi, & mut label, v) ;
@@ -85,13 +93,6 @@ fn dominators_given_rpo<G: ControlFlowGraph>(graph: G, rpo: &[G::Node]) -> Domin
85
93
86
94
bucket[ semi[ w] ] . push ( w) ;
87
95
88
- link ( & mut ancestor, & parent, w) ;
89
- let z = parent[ w] . unwrap ( ) ;
90
- for v in std:: mem:: take ( & mut bucket[ z] ) {
91
- let y = eval ( & pre_order_index, & mut ancestor, & semi, & mut label, v) ;
92
- idom[ v] = if pre_order_index[ semi[ y] ] < pre_order_index[ z] { y } else { z } ;
93
- }
94
-
95
96
// Optimization: We share the parent array between processed and not
96
97
// processed elements; lastlinked represents the divider.
97
98
lastlinked = Some ( w) ;
0 commit comments