commit d9b0d77cf20cb8340bc4a77b66aa8cb56c75b496
parent ce0ab53ed73fb24f9537cab762467efad56f2664
Author: Quentin Carbonneaux <quentin@c9x.me>
Date: Wed, 6 Feb 2019 09:09:03 +0100
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.
Diffstat:
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/spill.c b/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);