aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--amd64/isel.c6
-rw-r--r--ir.h3
-rw-r--r--regalloc.c2
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) {
diff --git a/ir.h b/ir.h
index 60a2ad8..85500d1 100644
--- a/ir.h
+++ b/ir.h
@@ -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;
diff --git a/regalloc.c b/regalloc.c
index ae81fcf..6aea986 100644
--- a/regalloc.c
+++ b/regalloc.c
@@ -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,);