Mesa (master): freedreno/ir3: DCE unused arrays

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 14 23:41:18 UTC 2020


Module: Mesa
Branch: master
Commit: 7f9039f0a894f50499c59ce834f2657ac8633b8d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7f9039f0a894f50499c59ce834f2657ac8633b8d

Author: Rob Clark <robdclark at chromium.org>
Date:   Tue Jul 14 10:36:04 2020 -0700

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 at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5907>

---

 src/freedreno/ir3/ir3.h     |  4 ++++
 src/freedreno/ir3/ir3_dce.c | 25 +++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h
index 51315a5f361..634089c590b 100644
--- a/src/freedreno/ir3/ir3.h
+++ b/src/freedreno/ir3/ir3.h
@@ -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.
  */
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
@@ -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:
 	 */



More information about the mesa-commit mailing list