{
Reg dest = ra_dest(as, ir, RID2RSET(r));
if (dest != r) {
+ lua_assert(rset_test(as->freeset, r));
ra_modified(as, r);
emit_movrr(as, ir, dest, r);
}
if (ra_hasspill(irp->s)) {
rset_clear(allow, ra_dest(as, ir, allow));
} else {
- lua_assert(ra_hasreg(irp->r));
- rset_clear(allow, irp->r);
- ra_destreg(as, ir, irp->r);
+ Reg r = irp->r;
+ lua_assert(ra_hasreg(r));
+ rset_clear(allow, r);
+ if (r != ir->r && !rset_test(as->freeset, r))
+ ra_restore(as, regcost_ref(as->cost[r]));
+ ra_destreg(as, ir, r);
}
return allow;
}