soften heuristic of 316b57
Instead of systematically spilling any temp live in an exit branch but not in the part of the loop already processed, only spill when it is already known to have been spilled.
This commit is contained in:
parent
ce0ab53ed7
commit
d9b0d77cf2
1 changed files with 15 additions and 4 deletions
19
spill.c
19
spill.c
|
@ -280,6 +280,19 @@ dopm(Blk *b, Ins *i, BSet *v)
|
|||
return i;
|
||||
}
|
||||
|
||||
static void
|
||||
merge(BSet *u, Blk *bu, BSet *v, Blk *bv)
|
||||
{
|
||||
int t;
|
||||
|
||||
if (bu->loop <= bv->loop)
|
||||
bsunion(u, v);
|
||||
else
|
||||
for (t=0; bsiter(v, &t); t++)
|
||||
if (tmp[t].slot == -1)
|
||||
bsset(u, t);
|
||||
}
|
||||
|
||||
/* spill code insertion
|
||||
* requires spill costs, rpo, liveness
|
||||
*
|
||||
|
@ -364,12 +377,10 @@ spill(Fn *fn)
|
|||
* in the middle of loops */
|
||||
bszero(v);
|
||||
liveon(w, b, s1);
|
||||
if (s1->loop >= b->loop)
|
||||
bsunion(v, w);
|
||||
merge(v, b, w, s1);
|
||||
if (s2) {
|
||||
liveon(u, b, s2);
|
||||
if (s2->loop >= b->loop)
|
||||
bsunion(v, u);
|
||||
merge(v, b, u, s2);
|
||||
bsinter(w, u);
|
||||
}
|
||||
limit2(v, 0, 0, w);
|
||||
|
|
Loading…
Add table
Reference in a new issue