/* Indicates if half-precision */
bool half;
+
+ bool unused;
};
struct ir3_array * ir3_lookup_array(struct ir3 *ir, unsigned id);
/* 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.
*/
* 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)
{
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));
}
}
}
+ foreach_array (arr, &ir->array_list)
+ arr->unused = true;
+
foreach_output (out, ir)
instr_dce(out, false);
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:
*/