From: Mark Thom Date: Mon, 10 Apr 2017 01:46:44 +0000 (-0600) Subject: adjust register allocation around cut X-Git-Tag: v0.8.110~745 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=0ef8dc03acaf71c044e8f4aa4e15917c79adfa22;p=scryer-prolog.git adjust register allocation around cut --- diff --git a/src/prolog/codegen.rs b/src/prolog/codegen.rs index d2ed6a7a..dab093da 100644 --- a/src/prolog/codegen.rs +++ b/src/prolog/codegen.rs @@ -729,7 +729,7 @@ impl<'a> CodeGenerator<'a> { } } - fn set_perm_vals(vs: &VariableFixtures) { + fn set_perm_vals(vs: &VariableFixtures, offset: usize) { let mut values_vec : Vec<_> = vs.values() .map(|ref v| (v.0, &v.1)) .collect(); @@ -744,7 +744,7 @@ impl<'a> CodeGenerator<'a> { for (i, v) in values_vec.into_iter().rev().enumerate() { if let VarStatus::Permanent(_) = v.0 { for cell in v.1 { - cell.set(VarReg::Norm(RegType::Perm(i + 1))); + cell.set(VarReg::Norm(RegType::Perm(i + 1 + offset))); } } else { break; @@ -783,7 +783,7 @@ impl<'a> CodeGenerator<'a> { } } - Self::set_perm_vals(&vs); + Self::set_perm_vals(&vs, deep_cuts as usize); (vs, deep_cuts) } @@ -887,7 +887,7 @@ impl<'a> CodeGenerator<'a> { let (vs, deep_cuts) = Self::mark_perm_vars(&rule); let &Rule { head: (ref p0, ref p1), ref clauses } = rule; - let perm_vars = Self::vars_above_threshold(&vs, 0); + let perm_vars = Self::vars_above_threshold(&vs, 0) + deep_cuts as usize; let mut body = Vec::new(); if clauses.len() > 0 {