Mesa (main): r300: Simplify DCE by assuming all output writes are used.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Feb 3 22:40:26 UTC 2022
Module: Mesa
Branch: main
Commit: 4f22f4ca1a8b18fad62a80ebcc68b7aa3e9078ee
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f22f4ca1a8b18fad62a80ebcc68b7aa3e9078ee
Author: Emma Anholt <emma at anholt.net>
Date: Mon Jan 31 11:45:36 2022 -0800
r300: Simplify DCE by assuming all output writes are used.
No change on shader-db.
Reviewed-by: Matt Turner <mattst88 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14847>
---
src/gallium/drivers/r300/compiler/r3xx_fragprog.c | 13 +------------
src/gallium/drivers/r300/compiler/r3xx_vertprog.c | 14 +-------------
.../drivers/r300/compiler/radeon_dataflow_deadcode.c | 16 ++++++----------
3 files changed, 8 insertions(+), 35 deletions(-)
diff --git a/src/gallium/drivers/r300/compiler/r3xx_fragprog.c b/src/gallium/drivers/r300/compiler/r3xx_fragprog.c
index 8aa4ef9e86b..1d41a552dd2 100644
--- a/src/gallium/drivers/r300/compiler/r3xx_fragprog.c
+++ b/src/gallium/drivers/r300/compiler/r3xx_fragprog.c
@@ -37,17 +37,6 @@
#include "r500_fragprog.h"
-static void dataflow_outputs_mark_use(void * userdata, void * data,
- void (*callback)(void *, unsigned int, unsigned int))
-{
- struct r300_fragment_program_compiler * c = userdata;
- callback(data, c->OutputColor[0], RC_MASK_XYZW);
- callback(data, c->OutputColor[1], RC_MASK_XYZW);
- callback(data, c->OutputColor[2], RC_MASK_XYZW);
- callback(data, c->OutputColor[3], RC_MASK_XYZW);
- callback(data, c->OutputDepth, RC_MASK_W);
-}
-
static void rc_rewrite_depth_out(struct radeon_compiler *cc, void *user)
{
struct r300_fragment_program_compiler *c = (struct r300_fragment_program_compiler*)cc;
@@ -128,7 +117,7 @@ void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c)
{"transform IF", 1, is_r500, rc_local_transform, rewrite_if},
{"native rewrite", 1, is_r500, rc_local_transform, native_rewrite_r500},
{"native rewrite", 1, !is_r500, rc_local_transform, native_rewrite_r300},
- {"deadcode", 1, opt, rc_dataflow_deadcode, dataflow_outputs_mark_use},
+ {"deadcode", 1, opt, rc_dataflow_deadcode, NULL},
{"emulate loops", 1, !is_r500, rc_emulate_loops, NULL},
{"register rename", 1, !is_r500 || opt, rc_rename_regs, NULL},
{"dataflow optimize", 1, opt, rc_optimize, NULL},
diff --git a/src/gallium/drivers/r300/compiler/r3xx_vertprog.c b/src/gallium/drivers/r300/compiler/r3xx_vertprog.c
index de0d98240f3..559a8ff54e7 100644
--- a/src/gallium/drivers/r300/compiler/r3xx_vertprog.c
+++ b/src/gallium/drivers/r300/compiler/r3xx_vertprog.c
@@ -772,18 +772,6 @@ static void rc_vs_add_artificial_outputs(struct radeon_compiler *c, void *user)
}
}
-static void dataflow_outputs_mark_used(void * userdata, void * data,
- void (*callback)(void *, unsigned int, unsigned int))
-{
- struct r300_vertex_program_compiler * c = userdata;
- int i;
-
- for(i = 0; i < 32; ++i) {
- if (c->RequiredOutputs & (1U << i))
- callback(data, i, RC_MASK_XYZW);
- }
-}
-
static int swizzle_is_native(rc_opcode opcode, struct rc_src_register reg)
{
(void) opcode;
@@ -909,7 +897,7 @@ void r3xx_compile_vertex_program(struct r300_vertex_program_compiler *c)
{"native rewrite", 1, is_r500, rc_local_transform, alu_rewrite_r500},
{"native rewrite", 1, !is_r500, rc_local_transform, alu_rewrite_r300},
{"emulate modifiers", 1, !is_r500, rc_local_transform, emulate_modifiers},
- {"deadcode", 1, opt, rc_dataflow_deadcode, dataflow_outputs_mark_used},
+ {"deadcode", 1, opt, rc_dataflow_deadcode, NULL},
{"dataflow optimize", 1, opt, rc_optimize, NULL},
/* This pass must be done after optimizations. */
{"source conflict resolve", 1, 1, rc_local_transform, resolve_src_conflicts},
diff --git a/src/gallium/drivers/r300/compiler/radeon_dataflow_deadcode.c b/src/gallium/drivers/r300/compiler/radeon_dataflow_deadcode.c
index 44fc13377fa..22b6d1ba58d 100644
--- a/src/gallium/drivers/r300/compiler/radeon_dataflow_deadcode.c
+++ b/src/gallium/drivers/r300/compiler/radeon_dataflow_deadcode.c
@@ -204,18 +204,10 @@ static void update_instruction(struct deadcode_state * s, struct rc_instruction
}
}
-static void mark_output_use(void * data, unsigned int index, unsigned int mask)
-{
- struct deadcode_state * s = data;
-
- mark_used(s, RC_FILE_OUTPUT, index, mask);
-}
-
void rc_dataflow_deadcode(struct radeon_compiler * c, void *user)
{
struct deadcode_state s;
unsigned int nr_instructions;
- rc_dataflow_mark_outputs_fn dce = (rc_dataflow_mark_outputs_fn)user;
unsigned int ip;
memset(&s, 0, sizeof(s));
@@ -225,13 +217,17 @@ void rc_dataflow_deadcode(struct radeon_compiler * c, void *user)
s.Instructions = memory_pool_malloc(&c->Pool, sizeof(struct instruction_state)*nr_instructions);
memset(s.Instructions, 0, sizeof(struct instruction_state)*nr_instructions);
- dce(c, &s, &mark_output_use);
-
for(struct rc_instruction * inst = c->Program.Instructions.Prev;
inst != &c->Program.Instructions;
inst = inst->Prev) {
const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->U.I.Opcode);
+ /* Assume all output regs are live. Anything else should have been
+ * eliminated before it got to us.
+ */
+ if (opcode->HasDstReg)
+ mark_used(&s, RC_FILE_OUTPUT, inst->U.I.DstReg.Index, inst->U.I.DstReg.WriteMask);
+
switch(opcode->Opcode){
/* Mark all sources in the loop body as used before doing
* normal deadcode analysis. This is probably not optimal.
More information about the mesa-commit
mailing list