i965/nir: Do optimizations again just before lowering source mods.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 20 Jan 2015 06:11:39 +0000 (22:11 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 23 Jan 2015 22:53:25 +0000 (14:53 -0800)
We want to run CSE and algebraic optimizations again after lowering IO.
Some of the passes in the optimization loop don't handle saturates and
other modifiers, so run it before lowering to source modifiers.

total instructions in shared programs: 6046190 -> 6045768 (-0.01%)
instructions in affected programs:     22406 -> 21984 (-1.88%)
helped:                                47
HURT:                                  0
GAINED:                                0
LOST:                                  0

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/brw_fs_nir.cpp

index 510092eae5057b27e8a22d306e750bfa69d87729..40a16736489e1d6a4a66b86c6ce278e5263a206c 100644 (file)
 #include "glsl/nir/glsl_to_nir.h"
 #include "brw_fs.h"
 
-void
-fs_visitor::emit_nir_code()
+static void
+nir_optimize(nir_shader *nir)
 {
-   /* first, lower the GLSL IR shader to NIR */
-   lower_output_reads(shader->base.ir);
-   nir_shader *nir = glsl_to_nir(shader->base.ir, NULL, true);
-   nir_validate_shader(nir);
-
-   nir_lower_global_vars_to_local(nir);
-   nir_validate_shader(nir);
-
-   nir_split_var_copies(nir);
-   nir_validate_shader(nir);
-
    bool progress;
    do {
       progress = false;
@@ -58,6 +47,23 @@ fs_visitor::emit_nir_code()
       progress |= nir_opt_constant_folding(nir);
       nir_validate_shader(nir);
    } while (progress);
+}
+
+void
+fs_visitor::emit_nir_code()
+{
+   /* first, lower the GLSL IR shader to NIR */
+   lower_output_reads(shader->base.ir);
+   nir_shader *nir = glsl_to_nir(shader->base.ir, NULL, true);
+   nir_validate_shader(nir);
+
+   nir_lower_global_vars_to_local(nir);
+   nir_validate_shader(nir);
+
+   nir_split_var_copies(nir);
+   nir_validate_shader(nir);
+
+   nir_optimize(nir);
 
    /* Lower a bunch of stuff */
    nir_lower_var_copies(nir);
@@ -81,6 +87,8 @@ fs_visitor::emit_nir_code()
    nir_lower_atomics(nir);
    nir_validate_shader(nir);
 
+   nir_optimize(nir);
+
    nir_lower_to_source_mods(nir);
    nir_validate_shader(nir);
    nir_copy_prop(nir);