Skip to content

Instantly share code, notes, and snippets.

@anarsoul
Created March 11, 2021 18:03
Show Gist options
  • Save anarsoul/105a676e1be85e75bc519d4378669bc1 to your computer and use it in GitHub Desktop.
Save anarsoul/105a676e1be85e75bc519d4378669bc1 to your computer and use it in GitHub Desktop.
diff --git a/src/gallium/drivers/lima/ir/pp/liveness.c b/src/gallium/drivers/lima/ir/pp/liveness.c
index 20954bd08be..a660e1fb6a5 100644
--- a/src/gallium/drivers/lima/ir/pp/liveness.c
+++ b/src/gallium/drivers/lima/ir/pp/liveness.c
@@ -50,9 +50,9 @@ ppir_liveness_set_clone(ppir_compiler *comp,
struct set *dest_set, struct set *src_set)
{
_mesa_set_clear(dest_set, NULL);
- memset(dest, 0, list_length(&comp->reg_list) * sizeof(struct ppir_liveness));
+ memset(dest, 0, comp->reg_num * sizeof(struct ppir_liveness));
memcpy(dest, src,
- list_length(&comp->reg_list) * sizeof(struct ppir_liveness));
+ comp->reg_num * sizeof(struct ppir_liveness));
set_foreach(src_set, entry_src) {
const struct ppir_liveness *s = entry_src->key;
@@ -260,7 +260,7 @@ ppir_liveness_compute_live_sets(ppir_compiler *comp)
struct set *temp_live_in_set = _mesa_set_create(comp,
_mesa_hash_pointer,
_mesa_key_pointer_equal);
- struct ppir_liveness temp_live_in[list_length(&comp->reg_list)];
+ struct ppir_liveness temp_live_in[comp->reg_num];
ppir_liveness_set_clone(comp,
temp_live_in, instr->live_in,
temp_live_in_set, instr->live_in_set);
diff --git a/src/gallium/drivers/lima/ir/pp/nir.c b/src/gallium/drivers/lima/ir/pp/nir.c
index 916e6f53e7e..78f97a75dd4 100644
--- a/src/gallium/drivers/lima/ir/pp/nir.c
+++ b/src/gallium/drivers/lima/ir/pp/nir.c
@@ -778,6 +778,7 @@ static ppir_compiler *ppir_compiler_create(void *prog, unsigned num_reg, unsigne
list_inithead(&comp->block_list);
list_inithead(&comp->reg_list);
+ comp->reg_num = 0;
comp->blocks = _mesa_hash_table_u64_create(prog);
comp->var_nodes = (ppir_node **)(comp + 1);
@@ -937,6 +938,7 @@ bool ppir_compile_nir(struct lima_fs_shader_state *prog, struct nir_shader *nir,
r->num_components = reg->num_components;
r->is_head = false;
list_addtail(&r->list, &comp->reg_list);
+ comp->reg_num++;
}
if (!ppir_emit_cf_list(comp, &func->body))
diff --git a/src/gallium/drivers/lima/ir/pp/ppir.h b/src/gallium/drivers/lima/ir/pp/ppir.h
index 8344a0038d6..8fce4fd0f4e 100644
--- a/src/gallium/drivers/lima/ir/pp/ppir.h
+++ b/src/gallium/drivers/lima/ir/pp/ppir.h
@@ -378,6 +378,7 @@ typedef struct ppir_compiler {
int cur_instr_index;
struct list_head reg_list;
+ int reg_num;
/* array for searching ssa/reg node */
ppir_node **var_nodes;
diff --git a/src/gallium/drivers/lima/ir/pp/regalloc.c b/src/gallium/drivers/lima/ir/pp/regalloc.c
index 5c5d13e5b9d..18f527c074b 100644
--- a/src/gallium/drivers/lima/ir/pp/regalloc.c
+++ b/src/gallium/drivers/lima/ir/pp/regalloc.c
@@ -151,6 +151,7 @@ static void ppir_regalloc_update_reglist_ssa(ppir_compiler *comp)
if (dest->type == ppir_target_ssa) {
reg = &dest->ssa;
list_addtail(&reg->list, &comp->reg_list);
+ comp->reg_num++;
}
}
}
@@ -314,6 +315,7 @@ static bool ppir_update_spilled_src(ppir_compiler *comp, ppir_block *block,
alu_dest->write_mask = u_bit_consecutive(0, num_components);
list_addtail(&alu_dest->ssa.list, &comp->reg_list);
+ comp->reg_num++;
if (!ppir_instr_insert_node(load_node->instr, move_node))
return false;
@@ -476,7 +478,7 @@ 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)
{
- float spill_costs[list_length(&comp->reg_list)];
+ float spill_costs[comp->reg_num];
/* experimentally determined, it seems to be worth scaling cost of
* regs in instructions that have used uniform/store_temp slots,
* but not too much as to offset the num_components base cost. */
@@ -532,7 +534,7 @@ static ppir_reg *ppir_regalloc_choose_spill_node(ppir_compiler *comp,
}
}
- for (int i = 0; i < list_length(&comp->reg_list); i++)
+ for (int i = 0; i < comp->reg_num; i++)
ra_set_node_spill_cost(g, i, spill_costs[i]);
int r = ra_get_best_spill_node(g);
@@ -567,7 +569,7 @@ static void ppir_regalloc_reset_liveness_info(ppir_compiler *comp)
if (block->live_in)
ralloc_free(block->live_in);
block->live_in = rzalloc_array(comp,
- struct ppir_liveness, list_length(&comp->reg_list));
+ struct ppir_liveness, comp->reg_num);
if (block->live_in_set)
_mesa_set_destroy(block->live_in_set, NULL);
@@ -578,7 +580,7 @@ static void ppir_regalloc_reset_liveness_info(ppir_compiler *comp)
if (block->live_out)
ralloc_free(block->live_out);
block->live_out = rzalloc_array(comp,
- struct ppir_liveness, list_length(&comp->reg_list));
+ struct ppir_liveness, comp->reg_num);
if (block->live_out_set)
_mesa_set_destroy(block->live_out_set, NULL);
@@ -591,7 +593,7 @@ static void ppir_regalloc_reset_liveness_info(ppir_compiler *comp)
if (instr->live_in)
ralloc_free(instr->live_in);
instr->live_in = rzalloc_array(comp,
- struct ppir_liveness, list_length(&comp->reg_list));
+ struct ppir_liveness, comp->reg_num);
if (instr->live_in_set)
_mesa_set_destroy(instr->live_in_set, NULL);
@@ -602,7 +604,7 @@ static void ppir_regalloc_reset_liveness_info(ppir_compiler *comp)
if (instr->live_internal)
ralloc_free(instr->live_internal);
instr->live_internal = rzalloc_array(comp,
- struct ppir_liveness, list_length(&comp->reg_list));
+ struct ppir_liveness, comp->reg_num);
if (instr->live_internal_set)
_mesa_set_destroy(instr->live_internal_set, NULL);
@@ -613,7 +615,7 @@ static void ppir_regalloc_reset_liveness_info(ppir_compiler *comp)
if (instr->live_out)
ralloc_free(instr->live_out);
instr->live_out = rzalloc_array(comp,
- struct ppir_liveness, list_length(&comp->reg_list));
+ struct ppir_liveness, comp->reg_num);
if (instr->live_out_set)
_mesa_set_destroy(instr->live_out_set, NULL);
@@ -645,7 +647,7 @@ static bool ppir_regalloc_prog_try(ppir_compiler *comp, bool *spilled)
ppir_regalloc_reset_liveness_info(comp);
struct ra_graph *g = ra_alloc_interference_graph(
- comp->ra, list_length(&comp->reg_list));
+ comp->ra, comp->reg_num);
int n = 0;
list_for_each_entry(ppir_reg, reg, &comp->reg_list, list) {
@@ -683,7 +685,7 @@ static bool ppir_regalloc_prog_try(ppir_compiler *comp, bool *spilled)
*spilled = true;
ppir_debug("spilled register %d/%d, num_components: %d\n",
- chosen->regalloc_index, list_length(&comp->reg_list),
+ chosen->regalloc_index, comp->reg_num,
chosen->num_components);
goto err_out;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment