further allocation fixes.

This commit is contained in:
Mark Thom
2018-03-08 12:38:38 -07:00
parent 179e425fb6
commit cb9aafbccf
3 changed files with 27 additions and 13 deletions

View File

@@ -542,7 +542,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
let &Rule { head: (_, ref args, ref p1), ref clauses } = rule; let &Rule { head: (_, ref args, ref p1), ref clauses } = rule;
let mut code = Vec::new(); let mut code = Vec::new();
self.marker.reset_arg(args.len());
self.marker.reset_at_head(args); self.marker.reset_at_head(args);
self.compile_seq_prelude(&conjunct_info, &mut code); self.compile_seq_prelude(&conjunct_info, &mut code);
@@ -613,7 +612,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
let mut code = Vec::new(); let mut code = Vec::new();
if let &Term::Clause(_, _, ref args, _) = term { if let &Term::Clause(_, _, ref args, _) = term {
self.marker.reset_arg(args.len());
self.marker.reset_at_head(args); self.marker.reset_at_head(args);
let iter = FactInstruction::iter(term); let iter = FactInstruction::iter(term);

View File

@@ -10,6 +10,7 @@ pub struct DebrayAllocator {
bindings: HashMap<Rc<Var>, VarData>, bindings: HashMap<Rc<Var>, VarData>,
arg_c: usize, arg_c: usize,
temp_lb: usize, temp_lb: usize,
arity: usize, // 0 if not at head.
contents: HashMap<usize, Rc<Var>>, contents: HashMap<usize, Rc<Var>>,
in_use: BTreeSet<usize>, in_use: BTreeSet<usize>,
} }
@@ -31,12 +32,17 @@ impl DebrayAllocator {
} }
} }
fn is_in_use(&self, r: usize) -> bool {
let in_use_range = r < self.arity && r > self.arg_c;
self.in_use.contains(&r) || in_use_range
}
fn alloc_with_cr(&self, var: &Var) -> usize fn alloc_with_cr(&self, var: &Var) -> usize
{ {
match self.bindings.get(var) { match self.bindings.get(var) {
Some(&VarData::Temp(_, _, ref tvd)) => { Some(&VarData::Temp(_, _, ref tvd)) => {
for &(_, reg) in tvd.use_set.iter() { for &(_, reg) in tvd.use_set.iter() {
if !self.in_use.contains(&reg) { if !self.is_in_use(reg) {
return reg; return reg;
} }
} }
@@ -44,7 +50,7 @@ impl DebrayAllocator {
let mut result = 0; let mut result = 0;
for reg in self.temp_lb .. { for reg in self.temp_lb .. {
if !self.in_use.contains(&reg) { if !self.is_in_use(reg) {
if !tvd.no_use_set.contains(&reg) { if !tvd.no_use_set.contains(&reg) {
result = reg; result = reg;
break; break;
@@ -63,7 +69,7 @@ impl DebrayAllocator {
match self.bindings.get(var) { match self.bindings.get(var) {
Some(&VarData::Temp(_, _, ref tvd)) => { Some(&VarData::Temp(_, _, ref tvd)) => {
for &(_, reg) in tvd.use_set.iter() { for &(_, reg) in tvd.use_set.iter() {
if !self.in_use.contains(&reg) { if !self.is_in_use(reg) {
return reg; return reg;
} }
} }
@@ -71,7 +77,7 @@ impl DebrayAllocator {
let mut result = 0; let mut result = 0;
for reg in self.temp_lb .. { for reg in self.temp_lb .. {
if !self.in_use.contains(&reg) { if !self.is_in_use(reg) {
if !tvd.no_use_set.contains(&reg) { if !tvd.no_use_set.contains(&reg) {
if !tvd.conflict_set.contains(&reg) { if !tvd.conflict_set.contains(&reg) {
result = reg; result = reg;
@@ -193,6 +199,7 @@ impl<'a> Allocator<'a> for DebrayAllocator
{ {
fn new() -> DebrayAllocator { fn new() -> DebrayAllocator {
DebrayAllocator { DebrayAllocator {
arity: 0,
arg_c: 1, arg_c: 1,
temp_lb: 1, temp_lb: 1,
bindings: HashMap::new(), bindings: HashMap::new(),
@@ -335,15 +342,24 @@ impl<'a> Allocator<'a> for DebrayAllocator
} }
fn reset_at_head(&mut self, args: &Vec<Box<Term>>) { fn reset_at_head(&mut self, args: &Vec<Box<Term>>) {
self.reset_arg(args.len());
self.arity = args.len();
for (idx, arg) in args.iter().enumerate() { for (idx, arg) in args.iter().enumerate() {
if let &Term::Var(_, ref var) = arg.as_ref() { if let &Term::Var(_, ref var) = arg.as_ref() {
self.contents.insert(idx + 1, var.clone()); let r = self.get(var.clone());
if !r.is_perm() && r.reg_num() == 0 {
self.in_use.insert(idx + 1); self.in_use.insert(idx + 1);
self.contents.insert(idx + 1, var.clone());
self.record_register(var.clone(), temp_v!(idx + 1));
}
} }
} }
} }
fn reset_arg(&mut self, arity: usize) { fn reset_arg(&mut self, arity: usize) {
self.arity = 0;
self.arg_c = 1; self.arg_c = 1;
self.temp_lb = arity + 1; self.temp_lb = arity + 1;
} }