Commit 71fb721c authored by Erico Nunes's avatar Erico Nunes
Browse files

lima/ppir: use ra_get_best_spill_node to select spill node



ra_get_best_spill_node is what other users of the mesa register
allocator use.
Switching to it now also fixes an infinite loop issue with ppir regalloc
with the ppir control flow patchset, and also provides a small gain over
the previous herusitic on number of spilled nodes testing with
shader-db.

Signed-off-by: Erico Nunes's avatarErico Nunes <nunes.erico@gmail.com>
Reviewed-by: Vasily Khoruzhick's avatarVasily Khoruzhick <anarsoul@gmail.com>
parent c1dc84e7
......@@ -545,20 +545,35 @@ static bool ppir_regalloc_spill_reg(ppir_compiler *comp, ppir_reg *chosen)
static ppir_reg *ppir_regalloc_choose_spill_node(ppir_compiler *comp,
struct ra_graph *g)
{
int max_range = -1;
int i = 0;
ppir_reg *chosen = NULL;
list_for_each_entry(ppir_reg, reg, &comp->reg_list, list) {
int range = reg->live_out - reg->live_in;
if (reg->spilled || reg->live_out == INT_MAX) {
/* not considered for spilling */
ra_set_node_spill_cost(g, i++, 0.0f);
continue;
}
/* It is beneficial to spill registers with higher component number,
* so increase the cost of spilling registers with few components */
float spill_cost = 4.0f / (float)reg->num_components;
ra_set_node_spill_cost(g, i++, spill_cost);
}
int r = ra_get_best_spill_node(g);
if (r == -1)
return NULL;
if (!reg->spilled && reg->live_out != INT_MAX && range > max_range) {
i = 0;
list_for_each_entry(ppir_reg, reg, &comp->reg_list, list) {
if (i++ == r) {
chosen = reg;
max_range = range;
break;
}
}
if (chosen)
chosen->spilled = true;
assert(chosen);
chosen->spilled = true;
return chosen;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment