From 6a2dca8b9986bd51be1617c68f1039db5d198243 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Mon, 5 Jan 2026 08:55:17 +0100 Subject: 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. --- spill.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'spill.c') 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--; -- cgit v1.2.3