aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <[email protected]>2026-01-05 08:55:17 +0100
committerQuentin Carbonneaux <[email protected]>2026-01-13 17:09:41 +0100
commit6a2dca8b9986bd51be1617c68f1039db5d198243 (patch)
treea7177cae459830fc43085efcb4b9f921ea9e1f48
parente0ded59639848a82878bbcf0b27fb3637f8d9353 (diff)
fix jmp arg spilling
In case we need to spill to accomodate for the jump argument, piggyback the reloads from slots to regalloc so that they can be correctly inserted on edges.
-rw-r--r--spill.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/spill.c b/spill.c
index 67c6540..4fb7a29 100644
--- a/spill.c
+++ b/spill.c
@@ -406,26 +406,20 @@ spill(Fn *fn)
if (rtype(b->jmp.arg) == RCall)
v->t[0] |= T.retregs(b->jmp.arg, 0);
}
- for (t=Tmp0; bsiter(b->out, &t); t++)
- if (!bshas(v, t))
- slot(t);
- bscopy(b->out, v);
-
- /* 2. process the block instructions */
if (rtype(b->jmp.arg) == RTmp) {
t = b->jmp.arg.val;
assert(KBASE(tmp[t].cls) == 0);
- lvarg[0] = bshas(v, t);
bsset(v, t);
- bscopy(u, v);
limit2(v, 0, 0, NULL);
- if (!bshas(v, t)) {
- if (!lvarg[0])
- bsclr(u, t);
+ if (!bshas(v, t))
b->jmp.arg = slot(t);
- }
- reloads(u, v);
}
+ for (t=Tmp0; bsiter(b->out, &t); t++)
+ if (!bshas(v, t))
+ slot(t);
+ bscopy(b->out, v);
+
+ /* 2. process the block instructions */
curi = &insb[NIns];
for (i=&b->ins[b->nins]; i!=b->ins;) {
i--;