aco: call nir_opt_algebraic_late() exhaustively
authorDaniel Schürmann <daniel@schuermann.dev>
Thu, 26 Sep 2019 10:08:13 +0000 (12:08 +0200)
committerDaniel Schürmann <daniel@schuermann.dev>
Mon, 30 Sep 2019 09:44:10 +0000 (09:44 +0000)
57559 shaders in 28980 tests
Totals:
SGPRS: 2963407 -> 2959935 (-0.12 %)
VGPRS: 2014812 -> 2016328 (0.08 %)
Spilled SGPRs: 1077 -> 1077 (0.00 %)
Spilled VGPRs: 0 -> 0 (0.00 %)
Private memory VGPRs: 0 -> 0 (0.00 %)
Scratch size: 10348 -> 10348 (0.00 %) dwords per thread
Code Size: 114545436 -> 114498084 (-0.04 %) bytes
LDS: 933 -> 933 (0.00 %) blocks
Max Waves: 375997 -> 375866 (-0.03 %)

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/amd/compiler/aco_instruction_selection_setup.cpp

index a1b2e4a7e578c336ab26f0a87d783ef3343129ea..a32ada0613e49857f9f7f49ac1a0bba8e1ee973a 100644 (file)
@@ -1324,13 +1324,24 @@ setup_isel_context(Program* program,
       nir_copy_prop(nir);
       nir_opt_constant_folding(nir);
       nir_opt_algebraic(nir);
-      nir_opt_algebraic_late(nir);
-      nir_opt_constant_folding(nir);
+
+      /* 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 = false;
+         NIR_PASS(more_late_algebraic, nir, nir_opt_algebraic_late);
+         NIR_PASS_V(nir, nir_opt_constant_folding);
+         NIR_PASS_V(nir, nir_copy_prop);
+         NIR_PASS_V(nir, nir_opt_dce);
+         NIR_PASS_V(nir, nir_opt_cse);
+      }
 
       /* cleanup passes */
       nir_lower_load_const_to_scalar(nir);
-      nir_opt_cse(nir);
-      nir_opt_dce(nir);
       nir_opt_shrink_load(nir);
       nir_move_options move_opts = (nir_move_options)(
          nir_move_const_undef | nir_move_load_ubo | nir_move_load_input | nir_move_comparisons);