From cfc49243c8451e3f120a9b593ca81c56bdbcf34d Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 12 Jul 2023 18:11:56 -0600 Subject: [PATCH] improve ground/1 performance (#1389) --- src/heap_iter.rs | 5 +++++ src/machine/machine_state_impl.rs | 20 ++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/heap_iter.rs b/src/heap_iter.rs index 96aef41d..c20840b7 100644 --- a/src/heap_iter.rs +++ b/src/heap_iter.rs @@ -218,6 +218,11 @@ impl<'a> StackfulPreOrderHeapIter<'a> { None } + #[inline] + pub fn stack_len(&self) -> usize { + self.stack.len() + } + fn push_if_unmarked(&mut self, loc: IterStackLoc) { let cell = self.read_cell_mut(loc); diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index 3bb118f9..6b08b93e 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -1612,6 +1612,8 @@ impl MachineState { // returns true on failure. pub fn ground_test(&mut self) -> bool { + use fxhash::FxBuildHasher; + if self.registers[1].is_constant() { return false; } @@ -1622,13 +1624,15 @@ impl MachineState { return true; } + let mut visited = IndexSet::with_hasher(FxBuildHasher::default()); let mut iter = stackful_preorder_iter(&mut self.heap, &mut self.stack, value); + let mut stack_len = 0; while let Some(value) = iter.next() { - let value = unmark_cell_bits!(value); + let mut value = unmark_cell_bits!(value); if value.is_var() { - let value = heap_bound_store( + value = heap_bound_store( iter.heap, heap_bound_deref(iter.heap, value), ); @@ -1637,6 +1641,18 @@ impl MachineState { return true; } } + + if value.is_compound(iter.heap) { + if visited.contains(&value) { + for _ in stack_len .. iter.stack_len() { + iter.pop_stack(); + } + } else { + visited.insert(value); + } + } + + stack_len = iter.stack_len(); } false -- 2.54.0