From de5de0cfaf68a5dd296f240d1568b96dbdf53a02 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 28 Nov 2023 12:58:54 -0700 Subject: [PATCH] allocate cut variables as temporaries when in non-allocating clause (#2183) --- src/allocator.rs | 11 ++++++++--- src/codegen.rs | 8 ++++++-- src/debray_allocator.rs | 18 +++++++++++++----- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/allocator.rs b/src/allocator.rs index e45c36b65..c2300f90f 100644 --- a/src/allocator.rs +++ b/src/allocator.rs @@ -29,20 +29,25 @@ pub(crate) trait Allocator { &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, term_loc: GenContext, code: &mut CodeDeque, r: RegType, 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>>( &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, context: GenContext, code: &mut CodeDeque, ); diff --git a/src/codegen.rs b/src/codegen.rs index 09722fbd3..993a122e6 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -926,12 +926,16 @@ impl<'b> CodeGenerator<'b> { match term { &QueryTerm::GetLevel(var_num) => { 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::(var_num, term_loc, code); code.push_back(instr!("get_level", r)); } &QueryTerm::GetCutPoint { var_num, prev_b } => { 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::(var_num, term_loc, code); code.push_back(if prev_b { instr!("get_prev_level", r) diff --git a/src/debray_allocator.rs b/src/debray_allocator.rs index 593e584ae..7154cea72 100644 --- a/src/debray_allocator.rs +++ b/src/debray_allocator.rs @@ -736,7 +736,7 @@ impl Allocator for DebrayAllocator { &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, term_loc: GenContext, code: &mut CodeDeque, ) { @@ -776,7 +776,7 @@ impl Allocator for DebrayAllocator { &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, term_loc: GenContext, code: &mut CodeDeque, r: RegType, @@ -840,10 +840,18 @@ impl Allocator for DebrayAllocator { 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) { - RegType::Perm(0) | RegType::Temp(0) => { - RegType::Perm(self.alloc_perm_var(var_num, chunk_num)) + RegType::Perm(0) => RegType::Perm(self.alloc_perm_var(var_num, term_loc.chunk_num())), + RegType::Temp(0) => { + let cell = Cell::default(); + self.mark_var::(var_num, Level::Shallow, &cell, term_loc, code); + cell.get().norm() } r => r, }