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 <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5907>
This commit is contained in:
parent
2e4bab84fb
commit
7f9039f0a8
|
@ -506,6 +506,8 @@ struct ir3_array {
|
|||
|
||||
/* Indicates if half-precision */
|
||||
bool half;
|
||||
|
||||
bool unused;
|
||||
};
|
||||
|
||||
struct ir3_array * ir3_lookup_array(struct ir3 *ir, unsigned id);
|
||||
|
@ -1244,6 +1246,8 @@ static inline bool __is_false_dep(struct ir3_instruction *instr, unsigned n)
|
|||
/* iterators for arrays: */
|
||||
#define foreach_array(__array, __list) \
|
||||
list_for_each_entry(struct ir3_array, __array, __list, node)
|
||||
#define foreach_array_safe(__array, __list) \
|
||||
list_for_each_entry_safe(struct ir3_array, __array, __list, node)
|
||||
|
||||
/* Check if condition is true for any src instruction.
|
||||
*/
|
||||
|
|
|
@ -33,6 +33,16 @@
|
|||
* Dead code elimination:
|
||||
*/
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -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:
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue