diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2021-05-09 18:59:52 -0400 |
|---|---|---|
| committer | Mark Rousskov <mark.simulacrum@gmail.com> | 2021-12-06 15:05:22 -0500 |
| commit | cc63ec32fb1921ce51425c90cded1f62f7971487 (patch) | |
| tree | de0be850597b7597781b1831745046301cb308eb /compiler/rustc_data_structures/src | |
| parent | 345ada0e1b17d21157b3963121c8238d39c763c0 (diff) | |
| download | rust-cc63ec32fb1921ce51425c90cded1f62f7971487.tar.gz rust-cc63ec32fb1921ce51425c90cded1f62f7971487.zip | |
Use variables rather than lengths directly
Diffstat (limited to 'compiler/rustc_data_structures/src')
| -rw-r--r-- | compiler/rustc_data_structures/src/graph/dominators/mod.rs | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/compiler/rustc_data_structures/src/graph/dominators/mod.rs b/compiler/rustc_data_structures/src/graph/dominators/mod.rs index 9d864057c85..e67986ae85c 100644 --- a/compiler/rustc_data_structures/src/graph/dominators/mod.rs +++ b/compiler/rustc_data_structures/src/graph/dominators/mod.rs @@ -27,18 +27,19 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> { IndexVec::from_elem_n(None, graph.num_nodes()); pre_order_to_real.push(graph.start_node()); real_to_pre_order[graph.start_node()] = Some(0); - let mut idx = 1; let mut post_order_idx = 0; 'recurse: while let Some(frame) = stack.last_mut() { while let Some(successor) = frame.iter.next() { if real_to_pre_order[successor].is_none() { - real_to_pre_order[successor] = Some(idx); - parent[idx] = Some(frame.node); + let pre_order_idx = pre_order_to_real.len(); + + real_to_pre_order[successor] = Some(pre_order_idx); + parent[pre_order_idx] = Some(frame.node); pre_order_to_real.push(successor); + stack + .push(PreOrderFrame { node: pre_order_idx, iter: graph.successors(successor) }); - stack.push(PreOrderFrame { node: idx, iter: graph.successors(successor) }); - idx += 1; continue 'recurse; } } @@ -48,13 +49,15 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> { stack.pop(); } - let mut idom = IndexVec::from_elem_n(0, pre_order_to_real.len()); - let mut semi = IndexVec::from_fn_n(std::convert::identity, pre_order_to_real.len()); + let reachable_vertices = pre_order_to_real.len(); + + let mut idom = IndexVec::from_elem_n(0, reachable_vertices); + let mut semi = IndexVec::from_fn_n(std::convert::identity, reachable_vertices); let mut label = semi.clone(); - let mut bucket = IndexVec::from_elem_n(vec![], pre_order_to_real.len()); + let mut bucket = IndexVec::from_elem_n(vec![], reachable_vertices); let mut lastlinked = None; - for w in (1..pre_order_to_real.len()).rev() { + for w in (1..reachable_vertices).rev() { // Optimization: process buckets just once, at the start of the // iteration. Do not explicitly empty the bucket (even though it will // not be used again), to save some instructions. @@ -84,7 +87,7 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> { // processed elements; lastlinked represents the divider. lastlinked = Some(w); } - for w in 1..pre_order_to_real.len() { + for w in 1..reachable_vertices { if idom[w] != semi[w] { idom[w] = idom[idom[w]]; } |
