When allocating a read register, prioritise registers that will not be used again.

This commit is contained in:
SarahW 2018-12-17 19:40:09 +00:00
commit b26432caa8

View file

@ -490,20 +490,29 @@ ir_host_reg_t codegen_reg_alloc_read_reg(codeblock_t *block, ir_reg_t ir_reg, in
if (c == reg_set->nr_regs) if (c == reg_set->nr_regs)
{ {
/*No unused registers. Search for an unlocked register*/ /*No unused registers. Search for an unlocked register with no pending reads*/
for (c = 0; c < reg_set->nr_regs; c++) for (c = 0; c < reg_set->nr_regs; c++)
{ {
if (!(reg_set->locked & (1 << c))) if (!(reg_set->locked & (1 << c)) && !ir_get_get_refcount(reg_set->regs[c]))
break; break;
} }
if (c == reg_set->nr_regs) if (c == reg_set->nr_regs)
fatal("codegen_reg_alloc_read_reg - out of registers\n"); {
/*Search for any unlocked register*/
for (c = 0; c < reg_set->nr_regs; c++)
{
if (!(reg_set->locked & (1 << c)))
break;
}
if (c == reg_set->nr_regs)
fatal("codegen_reg_alloc_read_reg - out of registers\n");
}
if (reg_set->dirty[c]) if (reg_set->dirty[c])
codegen_reg_writeback(reg_set, block, c, 1); codegen_reg_writeback(reg_set, block, c, 1);
// pclog(" load %i\n", c); // pclog(" load %i\n", c);
codegen_reg_load(reg_set, block, c, ir_reg); codegen_reg_load(reg_set, block, c, ir_reg);
reg_set->locked |= (1 << c);
// fatal("codegen_reg_alloc_read_reg - read %i.%i to %i\n", ir_reg.reg,ir_reg.version, c); // fatal("codegen_reg_alloc_read_reg - read %i.%i to %i\n", ir_reg.reg,ir_reg.version, c);
reg_set->locked |= (1 << c);
// codegen_reg_writeback(block, c); // codegen_reg_writeback(block, c);
reg_set->dirty[c] = 0; reg_set->dirty[c] = 0;
} }