about summary refs log tree commit diff
path: root/compiler/rustc_data_structures/src
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2021-05-09 18:59:52 -0400
committerMark Rousskov <mark.simulacrum@gmail.com>2021-12-06 15:05:22 -0500
commitcc63ec32fb1921ce51425c90cded1f62f7971487 (patch)
treede0be850597b7597781b1831745046301cb308eb /compiler/rustc_data_structures/src
parent345ada0e1b17d21157b3963121c8238d39c763c0 (diff)
downloadrust-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.rs23
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]];
         }