allocate cut variables as temporaries when in non-allocating clause (#2183)
This commit is contained in:
@@ -29,20 +29,25 @@ pub(crate) trait Allocator {
|
|||||||
&mut self,
|
&mut self,
|
||||||
var_num: usize,
|
var_num: usize,
|
||||||
lvl: Level,
|
lvl: Level,
|
||||||
cell: &'a Cell<VarReg>,
|
cell: &Cell<VarReg>,
|
||||||
term_loc: GenContext,
|
term_loc: GenContext,
|
||||||
code: &mut CodeDeque,
|
code: &mut CodeDeque,
|
||||||
r: RegType,
|
r: RegType,
|
||||||
is_new_var: bool,
|
is_new_var: bool,
|
||||||
);
|
);
|
||||||
|
|
||||||
fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType;
|
fn mark_cut_var<'a, Target: CompilationTarget<'a>>(
|
||||||
|
&mut self,
|
||||||
|
var_num: usize,
|
||||||
|
term_loc: GenContext,
|
||||||
|
code: &mut CodeDeque,
|
||||||
|
) -> RegType;
|
||||||
|
|
||||||
fn mark_var<'a, Target: CompilationTarget<'a>>(
|
fn mark_var<'a, Target: CompilationTarget<'a>>(
|
||||||
&mut self,
|
&mut self,
|
||||||
var_num: usize,
|
var_num: usize,
|
||||||
lvl: Level,
|
lvl: Level,
|
||||||
cell: &'a Cell<VarReg>,
|
cell: &Cell<VarReg>,
|
||||||
context: GenContext,
|
context: GenContext,
|
||||||
code: &mut CodeDeque,
|
code: &mut CodeDeque,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -926,12 +926,16 @@ impl<'b> CodeGenerator<'b> {
|
|||||||
match term {
|
match term {
|
||||||
&QueryTerm::GetLevel(var_num) => {
|
&QueryTerm::GetLevel(var_num) => {
|
||||||
let code = branch_code_stack.code(code);
|
let code = branch_code_stack.code(code);
|
||||||
let r = self.marker.mark_cut_var(var_num, chunk_num);
|
let r = self
|
||||||
|
.marker
|
||||||
|
.mark_cut_var::<QueryInstruction>(var_num, term_loc, code);
|
||||||
code.push_back(instr!("get_level", r));
|
code.push_back(instr!("get_level", r));
|
||||||
}
|
}
|
||||||
&QueryTerm::GetCutPoint { var_num, prev_b } => {
|
&QueryTerm::GetCutPoint { var_num, prev_b } => {
|
||||||
let code = branch_code_stack.code(code);
|
let code = branch_code_stack.code(code);
|
||||||
let r = self.marker.mark_cut_var(var_num, chunk_num);
|
let r = self
|
||||||
|
.marker
|
||||||
|
.mark_cut_var::<FactInstruction>(var_num, term_loc, code);
|
||||||
|
|
||||||
code.push_back(if prev_b {
|
code.push_back(if prev_b {
|
||||||
instr!("get_prev_level", r)
|
instr!("get_prev_level", r)
|
||||||
|
|||||||
@@ -736,7 +736,7 @@ impl Allocator for DebrayAllocator {
|
|||||||
&mut self,
|
&mut self,
|
||||||
var_num: usize,
|
var_num: usize,
|
||||||
lvl: Level,
|
lvl: Level,
|
||||||
cell: &'a Cell<VarReg>,
|
cell: &Cell<VarReg>,
|
||||||
term_loc: GenContext,
|
term_loc: GenContext,
|
||||||
code: &mut CodeDeque,
|
code: &mut CodeDeque,
|
||||||
) {
|
) {
|
||||||
@@ -776,7 +776,7 @@ impl Allocator for DebrayAllocator {
|
|||||||
&mut self,
|
&mut self,
|
||||||
var_num: usize,
|
var_num: usize,
|
||||||
lvl: Level,
|
lvl: Level,
|
||||||
cell: &'a Cell<VarReg>,
|
cell: &Cell<VarReg>,
|
||||||
term_loc: GenContext,
|
term_loc: GenContext,
|
||||||
code: &mut CodeDeque,
|
code: &mut CodeDeque,
|
||||||
r: RegType,
|
r: RegType,
|
||||||
@@ -840,10 +840,18 @@ impl Allocator for DebrayAllocator {
|
|||||||
self.in_use.insert(o);
|
self.in_use.insert(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType {
|
fn mark_cut_var<'a, Target: CompilationTarget<'a>>(
|
||||||
|
&mut self,
|
||||||
|
var_num: usize,
|
||||||
|
term_loc: GenContext,
|
||||||
|
code: &mut CodeDeque,
|
||||||
|
) -> RegType {
|
||||||
match self.get_binding(var_num) {
|
match self.get_binding(var_num) {
|
||||||
RegType::Perm(0) | RegType::Temp(0) => {
|
RegType::Perm(0) => RegType::Perm(self.alloc_perm_var(var_num, term_loc.chunk_num())),
|
||||||
RegType::Perm(self.alloc_perm_var(var_num, chunk_num))
|
RegType::Temp(0) => {
|
||||||
|
let cell = Cell::default();
|
||||||
|
self.mark_var::<Target>(var_num, Level::Shallow, &cell, term_loc, code);
|
||||||
|
cell.get().norm()
|
||||||
}
|
}
|
||||||
r => r,
|
r => r,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user