From 8ae9f786cbc1173e2530cf86b222549ac0106670 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Tue, 3 Nov 2015 16:47:47 -0500 Subject: add interference hints --- lisc/spill.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'lisc/spill.c') diff --git a/lisc/spill.c b/lisc/spill.c index 662df3f..b0dcd1b 100644 --- a/lisc/spill.c +++ b/lisc/spill.c @@ -210,6 +210,16 @@ limit(Bits *b, int k, Bits *fst) slot(tarr[i]); } +static void +sethint(Bits *u, ulong r) +{ + int t; + + for (t=Tmp0; t b->ins && (i-1)->op == OCall) { v->t[0] &= ~calldef(*(i-1), 0); limit(v, NReg - NRSave, 0); + r = 0; + for (n=0; nt[0] |= calluse(*(i-1), 0); - } else + } else { limit(v, NReg, 0); + r = v->t[0]; + } + sethint(v, r); reloads(&u, v); do emiti(*--i1); @@ -276,6 +294,7 @@ spill(Fn *fn) int j, s; Phi *p; Mem *ma; + ulong r; tmp = fn->tmp; ntmp = fn->ntmp; @@ -342,6 +361,7 @@ spill(Fn *fn) /* 2. process the block instructions */ curi = &insb[NIns]; + r = 0; for (i=&b->ins[b->nins]; i!=b->ins;) { assert(bcnt(&v) <= NReg); i--; @@ -400,11 +420,15 @@ spill(Fn *fn) i->arg[m] = slot(t); } } + r = v.t[0] & (BIT(Tmp0)-1); + if (r) + sethint(&v, r); reloads(&u, &v); if (s != -1) store(i->to, s); emiti(*i); } + assert(!r || b==fn->start); for (p=b->phi; p; p=p->link) { assert(rtype(p->to) == RTmp); -- cgit 1.4.1