diff options
| -rw-r--r-- | amd64/isel.c | 6 | ||||
| -rw-r--r-- | ir.h | 3 | ||||
| -rw-r--r-- | regalloc.c | 2 |
3 files changed, 8 insertions, 3 deletions
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) { @@ -109,7 +109,8 @@ enum intrin { struct instr { uchar op, cls; /* operation data class; also result class except for cmp ops (always i4) */ - uchar skip : 1; /* ignore during codegen: forms part of one machine instruction */ + uchar skip : 1, /* ignore during codegen: forms part of one machine instruction */ + keep : 1; /* for codegen, keep instr even if result seems unused */ uchar inplace : 1; /* set (by isel) for instructions which modify its first arg in place */ uchar reg; /* 0 -> no reg; else reg + 1 */ union ref l, r; @@ -688,7 +688,7 @@ regalloc(struct function *fn) blk->id = id++; for (int i = 0; i < blk->ins.n; ++i) { struct instr *ins = &instrtab[blk->ins.p[i]]; - if (!ins->reg && insrescls(*ins) && ins->op != Omove && !oiscmp(ins->op)) { + if (!ins->reg && insrescls(*ins) && ins->op != Omove && !ins->keep) { /* dead */ Nop: *ins = mkinstr(Onop,0,); |