aboutsummaryrefslogtreecommitdiffhomepage
path: root/amd64
diff options
context:
space:
mode:
Diffstat (limited to 'amd64')
-rw-r--r--amd64/isel.c6
1 files changed, 5 insertions, 1 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) {