Mesa (master): freedreno/ir3: rename depth->dce

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 13 21:06:29 UTC 2020


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

Author: Rob Clark <robdclark at chromium.org>
Date:   Sat Apr  4 10:29:53 2020 -0700

freedreno/ir3: rename depth->dce

Since DCE is the only remaining function of this pass, after the pre-RA
scheduler rewrite.

Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4440>

---

 src/freedreno/Makefile.sources               |  2 +-
 src/freedreno/ir3/ir3.c                      |  1 -
 src/freedreno/ir3/ir3.h                      | 26 +++------------
 src/freedreno/ir3/ir3_compiler_nir.c         |  4 +--
 src/freedreno/ir3/{ir3_depth.c => ir3_dce.c} | 50 +++++-----------------------
 src/freedreno/ir3/ir3_print.c                |  1 -
 src/freedreno/ir3/meson.build                |  2 +-
 7 files changed, 18 insertions(+), 68 deletions(-)

diff --git a/src/freedreno/Makefile.sources b/src/freedreno/Makefile.sources
index 07a59c97764..045d94ec6b7 100644
--- a/src/freedreno/Makefile.sources
+++ b/src/freedreno/Makefile.sources
@@ -29,7 +29,7 @@ ir3_SOURCES := \
 	ir3/ir3_context.h \
 	ir3/ir3_cp.c \
 	ir3/ir3_cf.c \
-	ir3/ir3_depth.c \
+	ir3/ir3_dce.c \
 	ir3/ir3_delay.c \
 	ir3/ir3_group.c \
 	ir3/ir3_image.c \
diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c
index f2dbc88f3bb..dcd5a5082a6 100644
--- a/src/freedreno/ir3/ir3.c
+++ b/src/freedreno/ir3/ir3.c
@@ -1149,7 +1149,6 @@ ir3_clear_mark(struct ir3 *ir)
 	}
 }
 
-/* note: this will destroy instr->depth, don't do it until after sched! */
 unsigned
 ir3_count_instructions(struct ir3 *ir)
 {
diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h
index 7fb0d823d25..b58cd6eb4be 100644
--- a/src/freedreno/ir3/ir3.h
+++ b/src/freedreno/ir3/ir3.h
@@ -306,25 +306,9 @@ struct ir3_instruction {
 		} input;
 	};
 
-	/* transient values used during various algorithms: */
-	union {
-		/* The instruction depth is the max dependency distance to output.
-		 *
-		 * You can also think of it as the "cost", if we did any sort of
-		 * optimization for register footprint.  Ie. a value that is  just
-		 * result of moving a const to a reg would have a low cost,  so to
-		 * it could make sense to duplicate the instruction at various
-		 * points where the result is needed to reduce register footprint.
-		 */
-		int depth;
-		/* When we get to the RA stage, we no longer need depth, but
-		 * we do need instruction's position/name:
-		 */
-		struct {
-			uint16_t ip;
-			uint16_t name;
-		};
-	};
+	/* When we get to the RA stage, we need instruction's position/name: */
+	uint16_t ip;
+	uint16_t name;
 
 	/* used for per-pass extra instruction data.
 	 *
@@ -1199,9 +1183,9 @@ unsigned ir3_delay_calc(struct ir3_block *block, struct ir3_instruction *instr,
 		bool soft, bool pred);
 void ir3_remove_nops(struct ir3 *ir);
 
-/* depth calculation: */
+/* dead code elimination: */
 struct ir3_shader_variant;
-void ir3_depth(struct ir3 *ir, struct ir3_shader_variant *so);
+void ir3_dce(struct ir3 *ir, struct ir3_shader_variant *so);
 
 /* fp16 conversion folding */
 void ir3_cf(struct ir3 *ir);
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 752adc8f1b7..365870509b3 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -3640,9 +3640,9 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
 
 	ir3_debug_print(ir, "AFTER GROUPING");
 
-	ir3_depth(ir, so);
+	ir3_dce(ir, so);
 
-	ir3_debug_print(ir, "AFTER DEPTH");
+	ir3_debug_print(ir, "AFTER DCE");
 
 	/* do Sethi–Ullman numbering before scheduling: */
 	ir3_sun(ir);
diff --git a/src/freedreno/ir3/ir3_depth.c b/src/freedreno/ir3/ir3_dce.c
similarity index 78%
rename from src/freedreno/ir3/ir3_depth.c
rename to src/freedreno/ir3/ir3_dce.c
index 90a0ddef51f..0bd8af537f4 100644
--- a/src/freedreno/ir3/ir3_depth.c
+++ b/src/freedreno/ir3/ir3_dce.c
@@ -30,26 +30,11 @@
 #include "ir3_shader.h"
 
 /*
- * Instruction Depth:
- *
- * Calculates weighted instruction depth, ie. the sum of # of needed
- * instructions plus delay slots back to original input (ie INPUT or
- * CONST).  That is to say, an instructions depth is:
- *
- *   depth(instr) {
- *     d = 0;
- *     // for each src register:
- *     foreach (src in instr->regs[1..n])
- *       d = max(d, delayslots(src->instr, n) + depth(src->instr));
- *     return d + 1;
- *   }
- *
- * After an instruction's depth is calculated, it is inserted into the
- * blocks depth sorted list, which is used by the scheduling pass.
+ * Dead code elimination:
  */
 
 static void
-ir3_instr_depth(struct ir3_instruction *instr, unsigned boost, bool falsedep)
+instr_dce(struct ir3_instruction *instr, bool falsedep)
 {
 	struct ir3_instruction *src;
 
@@ -60,26 +45,9 @@ ir3_instr_depth(struct ir3_instruction *instr, unsigned boost, bool falsedep)
 	if (ir3_instr_check_mark(instr))
 		return;
 
-	instr->depth = 0;
-
 	foreach_ssa_src_n (src, i, instr) {
-		unsigned sd;
-
-		/* visit child to compute it's depth: */
-		ir3_instr_depth(src, boost, __is_false_dep(instr, i));
-
-		/* for array writes, no need to delay on previous write: */
-		if (i == 0)
-			continue;
-
-		sd = ir3_delayslots(src, instr, i, true) + src->depth;
-		sd += boost;
-
-		instr->depth = MAX2(instr->depth, sd);
+		instr_dce(src, __is_false_dep(instr, i));
 	}
-
-	if (!is_meta(instr))
-		instr->depth++;
 }
 
 static bool
@@ -129,7 +97,7 @@ remove_unused_by_block(struct ir3_block *block)
 }
 
 static bool
-compute_depth_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
+find_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
 {
 	unsigned i;
 	bool progress = false;
@@ -154,15 +122,15 @@ compute_depth_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
 
 	struct ir3_instruction *out;
 	foreach_output (out, ir)
-		ir3_instr_depth(out, 0, false);
+		instr_dce(out, false);
 
 	foreach_block (block, &ir->block_list) {
 		for (i = 0; i < block->keeps_count; i++)
-			ir3_instr_depth(block->keeps[i], 0, false);
+			instr_dce(block->keeps[i], false);
 
 		/* We also need to account for if-condition: */
 		if (block->condition)
-			ir3_instr_depth(block->condition, 6, false);
+			instr_dce(block->condition, false);
 	}
 
 	/* remove un-used instructions: */
@@ -211,7 +179,7 @@ compute_depth_and_remove_unused(struct ir3 *ir, struct ir3_shader_variant *so)
 }
 
 void
-ir3_depth(struct ir3 *ir, struct ir3_shader_variant *so)
+ir3_dce(struct ir3 *ir, struct ir3_shader_variant *so)
 {
 	void *mem_ctx = ralloc_context(NULL);
 	bool progress;
@@ -219,7 +187,7 @@ ir3_depth(struct ir3 *ir, struct ir3_shader_variant *so)
 	ir3_find_ssa_uses(ir, mem_ctx, true);
 
 	do {
-		progress = compute_depth_and_remove_unused(ir, so);
+		progress = find_and_remove_unused(ir, so);
 	} while (progress);
 
 	ralloc_free(mem_ctx);
diff --git a/src/freedreno/ir3/ir3_print.c b/src/freedreno/ir3/ir3_print.c
index b18a3d27e34..753a9919ca0 100644
--- a/src/freedreno/ir3/ir3_print.c
+++ b/src/freedreno/ir3/ir3_print.c
@@ -72,7 +72,6 @@ static void print_instr_name(struct ir3_instruction *instr, bool flags)
 #endif
 	printf("%04u:", instr->name);
 	printf("%04u:", instr->ip);
-	printf("%03d:", instr->depth);
 	if (instr->flags & IR3_INSTR_UNUSED) {
 		printf("XXX: ");
 	} else {
diff --git a/src/freedreno/ir3/meson.build b/src/freedreno/ir3/meson.build
index 69103341158..068d4262ee7 100644
--- a/src/freedreno/ir3/meson.build
+++ b/src/freedreno/ir3/meson.build
@@ -55,8 +55,8 @@ libfreedreno_ir3_files = files(
   'ir3_context.h',
   'ir3_cf.c',
   'ir3_cp.c',
+  'ir3_dce.c',
   'ir3_delay.c',
-  'ir3_depth.c',
   'ir3_group.c',
   'ir3_image.c',
   'ir3_image.h',



More information about the mesa-commit mailing list