[Mesa-dev] [PATCH 71/92] radeonsi/nir: perform radeonsi-specific lowering and optimization passes

Nicolai Hähnle nhaehnle at gmail.com
Mon Jun 26 14:10:50 UTC 2017


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

---
 src/gallium/drivers/radeonsi/si_shader_nir.c | 41 ++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
index dc2ef8b..83c7ab1 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -330,20 +330,61 @@ si_lower_nir(struct si_shader_selector* sel)
 	nir_foreach_variable(variable, &sel->nir->outputs) {
 		variable->data.driver_location *= 4;
 
 		if (sel->nir->stage == MESA_SHADER_FRAGMENT) {
 			if (variable->data.location == FRAG_RESULT_DEPTH)
 				variable->data.driver_location += 2;
 			else if (variable->data.location == FRAG_RESULT_STENCIL)
 				variable->data.driver_location += 1;
 		}
 	}
+
+	/* Perform lowerings (and optimizations) of code.
+	 *
+	 * Performance considerations aside, we must:
+	 * - lower certain ALU operations
+	 * - ensure constant offsets for texture instructions are folded
+	 *   and copy-propagated
+	 */
+	NIR_PASS_V(sel->nir, nir_lower_returns);
+	NIR_PASS_V(sel->nir, nir_lower_vars_to_ssa);
+	NIR_PASS_V(sel->nir, nir_lower_alu_to_scalar);
+	NIR_PASS_V(sel->nir, nir_lower_phis_to_scalar);
+
+	bool progress;
+	do {
+		progress = false;
+
+		/* (Constant) copy propagation is needed for txf with offsets. */
+		NIR_PASS(progress, sel->nir, nir_copy_prop);
+		NIR_PASS(progress, sel->nir, nir_opt_remove_phis);
+		NIR_PASS(progress, sel->nir, nir_opt_dce);
+		if (nir_opt_trivial_continues(sel->nir)) {
+			progress = true;
+			NIR_PASS(progress, sel->nir, nir_copy_prop);
+			NIR_PASS(progress, sel->nir, nir_opt_dce);
+		}
+		NIR_PASS(progress, sel->nir, nir_opt_if);
+		NIR_PASS(progress, sel->nir, nir_opt_dead_cf);
+		NIR_PASS(progress, sel->nir, nir_opt_cse);
+		NIR_PASS(progress, sel->nir, nir_opt_peephole_select, 8);
+
+		/* Needed for algebraic lowering */
+		NIR_PASS(progress, sel->nir, nir_opt_algebraic);
+		NIR_PASS(progress, sel->nir, nir_opt_constant_folding);
+
+		NIR_PASS(progress, sel->nir, nir_opt_undef);
+		NIR_PASS(progress, sel->nir, nir_opt_conditional_discard);
+		if (sel->nir->options->max_unroll_iterations) {
+			NIR_PASS(progress, sel->nir, nir_opt_loop_unroll, 0);
+		}
+	} while (progress);
 }
 
 static void declare_nir_input_vs(struct si_shader_context *ctx,
 				 struct nir_variable *variable, unsigned rel,
 				 LLVMValueRef out[4])
 {
 	si_llvm_load_input_vs(ctx, variable->data.driver_location / 4 + rel, out);
 }
 
 static void declare_nir_input_fs(struct si_shader_context *ctx,
-- 
2.9.3



More information about the mesa-dev mailing list