Skip to content

Commit cc63ec3

Browse files
Use variables rather than lengths directly
1 parent 345ada0 commit cc63ec3

File tree

1 file changed

+13
-10
lines changed
  • compiler/rustc_data_structures/src/graph/dominators

1 file changed

+13
-10
lines changed

compiler/rustc_data_structures/src/graph/dominators/mod.rs

+13-10
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,19 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
2727
IndexVec::from_elem_n(None, graph.num_nodes());
2828
pre_order_to_real.push(graph.start_node());
2929
real_to_pre_order[graph.start_node()] = Some(0);
30-
let mut idx = 1;
3130
let mut post_order_idx = 0;
3231

3332
'recurse: while let Some(frame) = stack.last_mut() {
3433
while let Some(successor) = frame.iter.next() {
3534
if real_to_pre_order[successor].is_none() {
36-
real_to_pre_order[successor] = Some(idx);
37-
parent[idx] = Some(frame.node);
35+
let pre_order_idx = pre_order_to_real.len();
36+
37+
real_to_pre_order[successor] = Some(pre_order_idx);
38+
parent[pre_order_idx] = Some(frame.node);
3839
pre_order_to_real.push(successor);
40+
stack
41+
.push(PreOrderFrame { node: pre_order_idx, iter: graph.successors(successor) });
3942

40-
stack.push(PreOrderFrame { node: idx, iter: graph.successors(successor) });
41-
idx += 1;
4243
continue 'recurse;
4344
}
4445
}
@@ -48,13 +49,15 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
4849
stack.pop();
4950
}
5051

51-
let mut idom = IndexVec::from_elem_n(0, pre_order_to_real.len());
52-
let mut semi = IndexVec::from_fn_n(std::convert::identity, pre_order_to_real.len());
52+
let reachable_vertices = pre_order_to_real.len();
53+
54+
let mut idom = IndexVec::from_elem_n(0, reachable_vertices);
55+
let mut semi = IndexVec::from_fn_n(std::convert::identity, reachable_vertices);
5356
let mut label = semi.clone();
54-
let mut bucket = IndexVec::from_elem_n(vec![], pre_order_to_real.len());
57+
let mut bucket = IndexVec::from_elem_n(vec![], reachable_vertices);
5558
let mut lastlinked = None;
5659

57-
for w in (1..pre_order_to_real.len()).rev() {
60+
for w in (1..reachable_vertices).rev() {
5861
// Optimization: process buckets just once, at the start of the
5962
// iteration. Do not explicitly empty the bucket (even though it will
6063
// not be used again), to save some instructions.
@@ -84,7 +87,7 @@ pub fn dominators<G: ControlFlowGraph>(graph: G) -> Dominators<G::Node> {
8487
// processed elements; lastlinked represents the divider.
8588
lastlinked = Some(w);
8689
}
87-
for w in 1..pre_order_to_real.len() {
90+
for w in 1..reachable_vertices {
8891
if idom[w] != semi[w] {
8992
idom[w] = idom[idom[w]];
9093
}

0 commit comments

Comments
 (0)