improve ground/1 performance (#1389)

This commit is contained in:
Mark
2023-07-12 18:11:56 -06:00
parent 29430ec88b
commit cfc49243c8
2 changed files with 23 additions and 2 deletions

View File

@@ -218,6 +218,11 @@ impl<'a> StackfulPreOrderHeapIter<'a> {
None None
} }
#[inline]
pub fn stack_len(&self) -> usize {
self.stack.len()
}
fn push_if_unmarked(&mut self, loc: IterStackLoc) { fn push_if_unmarked(&mut self, loc: IterStackLoc) {
let cell = self.read_cell_mut(loc); let cell = self.read_cell_mut(loc);

View File

@@ -1612,6 +1612,8 @@ impl MachineState {
// returns true on failure. // returns true on failure.
pub fn ground_test(&mut self) -> bool { pub fn ground_test(&mut self) -> bool {
use fxhash::FxBuildHasher;
if self.registers[1].is_constant() { if self.registers[1].is_constant() {
return false; return false;
} }
@@ -1622,13 +1624,15 @@ impl MachineState {
return true; 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 iter = stackful_preorder_iter(&mut self.heap, &mut self.stack, value);
let mut stack_len = 0;
while let Some(value) = iter.next() { while let Some(value) = iter.next() {
let value = unmark_cell_bits!(value); let mut value = unmark_cell_bits!(value);
if value.is_var() { if value.is_var() {
let value = heap_bound_store( value = heap_bound_store(
iter.heap, iter.heap,
heap_bound_deref(iter.heap, value), heap_bound_deref(iter.heap, value),
); );
@@ -1637,6 +1641,18 @@ impl MachineState {
return true; 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 false