When allocating a read register, prioritise registers that will not be used again.
This commit is contained in:
parent
e8483acea5
commit
b26432caa8
1 changed files with 13 additions and 4 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue