From b26432caa8ea399d81a5f88835293d012d4f2010 Mon Sep 17 00:00:00 2001 From: SarahW Date: Mon, 17 Dec 2018 19:40:09 +0000 Subject: [PATCH] When allocating a read register, prioritise registers that will not be used again. --- src/codegen_reg.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/codegen_reg.c b/src/codegen_reg.c index 255fde7..c222d04 100644 --- a/src/codegen_reg.c +++ b/src/codegen_reg.c @@ -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) { - /*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++) { - if (!(reg_set->locked & (1 << c))) + if (!(reg_set->locked & (1 << c)) && !ir_get_get_refcount(reg_set->regs[c])) break; } 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]) codegen_reg_writeback(reg_set, block, c, 1); // pclog(" load %i\n", c); 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); + reg_set->locked |= (1 << c); // codegen_reg_writeback(block, c); reg_set->dirty[c] = 0; }