/* 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:
         */