aboutsummaryrefslogtreecommitdiffstats
path: root/src/freedreno/ir3/ir3_dce.c
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2020-07-14 10:36:04 -0700
committerMarge Bot <[email protected]>2020-07-14 23:26:15 +0000
commit7f9039f0a894f50499c59ce834f2657ac8633b8d (patch)
treef3efb3f1774d7feee25bfbd0448ddee59bb16abb /src/freedreno/ir3/ir3_dce.c
parent2e4bab84fb6ee09d4b85a1ce722869e27858aec6 (diff)
freedreno/ir3: DCE unused arrays
Letting unused arrays stick around confuses RA, which assigns vreg names to the unused arrays, but then does not precolor them (because they are unused). This leads to an assert in ra_select_reg_merged(): skqp: ../src/freedreno/ir3/ir3_ra.c:589: name_to_instr: Assertion '!name_is_array(ctx, name)' failed. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3262 Signed-off-by: Rob Clark <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5907>
Diffstat (limited to 'src/freedreno/ir3/ir3_dce.c')
-rw-r--r--src/freedreno/ir3/ir3_dce.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/freedreno/ir3/ir3_dce.c b/src/freedreno/ir3/ir3_dce.c
index 92a5d87eed8..e1e303f5482 100644
--- a/src/freedreno/ir3/ir3_dce.c
+++ b/src/freedreno/ir3/ir3_dce.c
@@ -34,6 +34,16 @@
*/
static void
+mark_array_use(struct ir3_instruction *instr, struct ir3_register *reg)
+{
+ if (reg->flags & IR3_REG_ARRAY) {
+ struct ir3_array *arr =
+ ir3_lookup_array(instr->block->shader, reg->array.id);
+ arr->unused = false;
+ }
+}
+
+static void
instr_dce(struct ir3_instruction *instr, bool falsedep)
{
/* don't mark falsedep's as used, but otherwise process them normally: */
@@ -43,6 +53,12 @@ instr_dce(struct ir3_instruction *instr, bool falsedep)
if (ir3_instr_check_mark(instr))
return;
+ if (writes_gpr(instr))
+ mark_array_use(instr, instr->regs[0]); /* dst */
+
+ foreach_src (reg, instr)
+ mark_array_use(instr, reg); /* src */
+
foreach_ssa_src_n (src, i, instr) {
instr_dce(src, __is_false_dep(instr, i));
}
@@ -118,6 +134,9 @@ find_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
}
}
+ foreach_array (arr, &ir->array_list)
+ arr->unused = true;
+
foreach_output (out, ir)
instr_dce(out, false);
@@ -135,6 +154,12 @@ find_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
progress |= remove_unused_by_block(block);
}
+ /* remove un-used arrays: */
+ foreach_array_safe (arr, &ir->array_list) {
+ if (arr->unused)
+ list_delinit(&arr->node);
+ }
+
/* fixup wrmask of split instructions to account for adjusted tex
* wrmask's:
*/