Created
March 11, 2021 18:03
-
-
Save anarsoul/105a676e1be85e75bc519d4378669bc1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(®->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