freedreno/ir3: split out regmask
[mesa.git] / src / freedreno / ir3 / ir3_dce.c
index 92a5d87eed81812ed87693e7a3a230f07ea073e1..e1e303f548279e940a8af80f5ae059690ed55e9a 100644 (file)
  * 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:
         */