From ba84ebbd89d1dbe431f71b010b2d71214303ae48 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 24 Jun 2023 23:37:14 +0200 Subject: fix regalloc thinking some ins are dead by adding ins.keep --- amd64/isel.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'amd64') diff --git a/amd64/isel.c b/amd64/isel.c index 688fabd..420e392 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -284,6 +284,7 @@ sel(struct function *fn, struct instr *ins, struct block *blk, int *curi) insertinstr(blk, (*curi)++, mkinstr(Omove, ins->cls, mkref(RREG, RDX), mkref(RREG, RDX))); fixarg(&ins->r, ins, blk, curi); /* make sure rhs is memory or reg */ ins->l = mkref(RREG, RAX); + ins->keep = 1; if (op == Orem) ins->op = Odiv; else if (op == Ourem) ins->op = Oudiv; insertinstr(blk, (*curi)++, *ins); /* duplicate ins to reuse tmp ref */ @@ -379,12 +380,15 @@ seljmp(struct function *fn, struct block *blk) sel(fn, &instrtab[c.i], blk, &curi); } if (iflagsrc == c.i) { - if (!oiscmp(instrtab[c.i].op)) + if (!oiscmp(instrtab[c.i].op)) { blk->jmp.arg[0] = NOREF; /* implicit by zero flag */ + } + instrtab[c.i].keep = 1; } else { if (!(opflags[instrtab[c.i].op] & ZF) || c.i != blk->ins.p[blk->ins.n - 1]) { blk->jmp.arg[0] = insertinstr(blk, blk->ins.n, mkinstr(Oneq, instrtab[c.i].cls, c, ZEROREF)); } + instrtab[blk->jmp.arg[0].i].keep = 1; } } else if (blk->jmp.t == Jret) { if (blk->jmp.arg[0].bits) { -- cgit v1.2.3