From 10e508c8156785e6481bff37b3446c347aa56fea Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 27 Sep 2019 12:49:06 +0200 Subject: [PATCH] freedreno: Enable the nir_opt_algebraic_late() pass. Reviewed-by: Rob Clark Reviewed-by: Connor Abbott --- src/freedreno/ir3/ir3_nir.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c index 0a62523ccce..9342c9d299b 100644 --- a/src/freedreno/ir3/ir3_nir.c +++ b/src/freedreno/ir3/ir3_nir.c @@ -263,6 +263,20 @@ ir3_optimize_nir(struct ir3_shader *shader, nir_shader *s, if (ubo_progress || idiv_progress) ir3_optimize_loop(s); + /* Do late algebraic optimization to turn add(a, neg(b)) back into + * subs, then the mandatory cleanup after algebraic. Note that it may + * produce fnegs, and if so then we need to keep running to squash + * fneg(fneg(a)). + */ + bool more_late_algebraic = true; + while (more_late_algebraic) { + more_late_algebraic = OPT(s, nir_opt_algebraic_late); + OPT_V(s, nir_opt_constant_folding); + OPT_V(s, nir_copy_prop); + OPT_V(s, nir_opt_dce); + OPT_V(s, nir_opt_cse); + } + OPT_V(s, nir_remove_dead_variables, nir_var_function_temp); OPT_V(s, nir_opt_sink, nir_move_const_undef); -- 2.30.2