Move cmp_in_dominator_order
out of graph dominator computation · rust-lang/rust@7f4dd9b (original) (raw)
`@@ -9,8 +9,6 @@
`
9
9
`//! Thomas Lengauer and Robert Endre Tarjan.
`
10
10
`//! https://www.cs.princeton.edu/courses/archive/spr03/cs423/download/dominators.pdf
`
11
11
``
12
``
`-
use std::cmp::Ordering;
`
13
``
-
14
12
`use rustc_index::{Idx, IndexSlice, IndexVec};
`
15
13
``
16
14
`use super::ControlFlowGraph;
`
`@@ -64,9 +62,6 @@ fn is_small_path_graph<G: ControlFlowGraph>(g: &G) -> bool {
`
64
62
`}
`
65
63
``
66
64
`fn dominators_impl<G: ControlFlowGraph>(graph: &G) -> Inner<G::Node> {
`
67
``
`-
// compute the post order index (rank) for each node
`
68
``
`-
let mut post_order_rank = IndexVec::from_elem_n(0, graph.num_nodes());
`
69
``
-
70
65
`// We allocate capacity for the full set of nodes, because most of the time
`
71
66
`// most of the nodes are reachable.
`
72
67
`let mut parent: IndexVec<PreorderIndex, PreorderIndex> =
`
`@@ -83,12 +78,10 @@ fn dominators_impl<G: ControlFlowGraph>(graph: &G) -> Inner<G::Node> {
`
83
78
` pre_order_to_real.push(graph.start_node());
`
84
79
` parent.push(PreorderIndex::ZERO); // the parent of the root node is the root for now.
`
85
80
` real_to_pre_order[graph.start_node()] = Some(PreorderIndex::ZERO);
`
86
``
`-
let mut post_order_idx = 0;
`
87
81
``
88
82
`// Traverse the graph, collecting a number of things:
`
89
83
`//
`
90
84
`// * Preorder mapping (to it, and back to the actual ordering)
`
91
``
`` -
// * Postorder mapping (used exclusively for cmp_in_dominator_order
on the final product)
``
92
85
`// * Parents for each vertex in the preorder tree
`
93
86
`//
`
94
87
`// These are all done here rather than through one of the 'standard'
`
`@@ -104,8 +97,6 @@ fn dominators_impl<G: ControlFlowGraph>(graph: &G) -> Inner<G::Node> {
`
104
97
`continue 'recurse;
`
105
98
`}
`
106
99
`}
`
107
``
`-
post_order_rank[pre_order_to_real[frame.pre_order_idx]] = post_order_idx;
`
108
``
`-
post_order_idx += 1;
`
109
100
``
110
101
` stack.pop();
`
111
102
`}
`
`@@ -282,7 +273,7 @@ fn dominators_impl<G: ControlFlowGraph>(graph: &G) -> Inner<G::Node> {
`
282
273
``
283
274
`let time = compute_access_time(start_node, &immediate_dominators);
`
284
275
``
285
``
`-
Inner { post_order_rank, immediate_dominators, time }
`
``
276
`+
Inner { immediate_dominators, time }
`
286
277
`}
`
287
278
``
288
279
`/// Evaluate the link-eval virtual forest, providing the currently minimum semi
`
`@@ -348,7 +339,6 @@ fn compress(
`
348
339
`/// Tracks the list of dominators for each node.
`
349
340
`#[derive(Clone, Debug)]
`
350
341
`struct Inner<N: Idx> {
`
351
``
`-
post_order_rank: IndexVec<N, usize>,
`
352
342
`// Even though we track only the immediate dominator of each node, it's
`
353
343
`// possible to get its full list of dominators by looking up the dominator
`
354
344
`// of each dominator.
`
`@@ -379,17 +369,6 @@ impl<Node: Idx> Dominators {
`
379
369
`}
`
380
370
`}
`
381
371
``
382
``
`-
/// Provide deterministic ordering of nodes such that, if any two nodes have a dominator
`
383
``
`-
/// relationship, the dominator will always precede the dominated. (The relative ordering
`
384
``
`-
/// of two unrelated nodes will also be consistent, but otherwise the order has no
`
385
``
`-
/// meaning.) This method cannot be used to determine if either Node dominates the other.
`
386
``
`-
pub fn cmp_in_dominator_order(&self, lhs: Node, rhs: Node) -> Ordering {
`
387
``
`-
match &self.kind {
`
388
``
`-
Kind::Path => lhs.index().cmp(&rhs.index()),
`
389
``
`-
Kind::General(g) => g.post_order_rank[rhs].cmp(&g.post_order_rank[lhs]),
`
390
``
`-
}
`
391
``
`-
}
`
392
``
-
393
372
`` /// Returns true if a
dominates b
.
``
394
373
`///
`
395
374
`/// # Panics
`