[Mesa-dev] [PATCH 14/21] etnaviv: nir: remove undefined variables
Philipp Zabel
p.zabel at pengutronix.de
Tue Jun 5 14:38:38 UTC 2018
From: Michael Tretter <m.tretter at pengutronix.de>
If the source to a mov instruction is undefined, the result is undefined
as well. In that case it is valid to drop the mov instruction.
Signed-off-by: Michael Tretter <m.tretter at pengutronix.de>
Signed-off-by: Philipp Zabel <p.zabel at pengutronix.de>
---
src/gallium/drivers/etnaviv/etnaviv_nir.c | 35 +++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/src/gallium/drivers/etnaviv/etnaviv_nir.c b/src/gallium/drivers/etnaviv/etnaviv_nir.c
index 1a71459c3a20..7889adf473ab 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_nir.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_nir.c
@@ -198,6 +198,40 @@ etna_opt_merge_alu_mov_pair(nir_shader *shader)
}
}
+/* Remove mov alu_ops from undefined variables, because the destination will
+ * be undefined as well and the write is unnecessary.
+ */
+static void
+etna_opt_remove_mov_undef(nir_shader *shader)
+{
+ nir_foreach_function(function, shader) {
+ nir_foreach_block(block, function->impl) {
+ nir_foreach_instr_safe(instr, block) {
+ if (instr->type != nir_instr_type_alu)
+ continue;
+
+ nir_alu_instr *alu = nir_instr_as_alu(instr);
+ if (alu->op != nir_op_imov)
+ continue;
+
+ unsigned i;
+ for (i = 0; i < nir_op_infos[alu->op].num_inputs; i++) {
+ if (!alu->src[i].src.is_ssa ||
+ alu->src[i].src.ssa->parent_instr->type != nir_instr_type_ssa_undef)
+ break;
+ }
+ if (i != nir_op_infos[alu->op].num_inputs)
+ continue;
+
+ nir_instr_remove(instr);
+ /* TODO Remove nir_instr_type_ssa_undef instruction */
+ }
+ }
+ nir_metadata_preserve(function->impl, nir_metadata_block_index |
+ nir_metadata_dominance);
+ }
+}
+
/* Move const loads, input load intrinsics, and uniform load intrinsics to the
* beginning of the function implementation.
*
@@ -935,6 +969,7 @@ etna_optimize_nir(struct etna_shader *shader,
NIR_PASS_V(s, nir_move_vec_src_uses_to_dest);
NIR_PASS_V(s, nir_lower_vec_to_movs);
NIR_PASS_V(s, etna_opt_merge_alu_mov_pair);
+ NIR_PASS_V(s, etna_opt_remove_mov_undef);
nir_sweep(s);
--
2.17.1
More information about the mesa-dev
mailing list