From cb212938d424a94695e35bb92e20613a2af72a0f Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Mon, 9 Dec 2019 14:51:59 +1100 Subject: [PATCH] Avoid re-processing nodes in `find_cycles_from_node`. --- .../obligation_forest/mod.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/librustc_data_structures/obligation_forest/mod.rs b/src/librustc_data_structures/obligation_forest/mod.rs index 0ee751d33c957..b1931ca459f61 100644 --- a/src/librustc_data_structures/obligation_forest/mod.rs +++ b/src/librustc_data_structures/obligation_forest/mod.rs @@ -584,7 +584,7 @@ impl ObligationForest { // function call. if let NodeState::Success(waiting) = node.state.get() { if !self.is_still_waiting(waiting) { - self.find_cycles_from_node(&mut stack, processor, index); + self.find_cycles_from_node(&mut stack, processor, index, index); } } } @@ -592,7 +592,8 @@ impl ObligationForest { debug_assert!(stack.is_empty()); } - fn find_cycles_from_node

(&self, stack: &mut Vec, processor: &mut P, index: usize) + fn find_cycles_from_node

(&self, stack: &mut Vec, processor: &mut P, min_index: usize, + index: usize) where P: ObligationProcessor { let node = &self.nodes[index]; @@ -601,8 +602,11 @@ impl ObligationForest { match stack.iter().rposition(|&n| n == index) { None => { stack.push(index); - for &index in node.dependents.iter() { - self.find_cycles_from_node(stack, processor, index); + for &dep_index in node.dependents.iter() { + // The index check avoids re-considering a node. + if dep_index >= min_index { + self.find_cycles_from_node(stack, processor, min_index, dep_index); + } } stack.pop(); }