[Mesa-dev] [PATCH 2/2] i965: run brw_vec4 optimizations in loop

Juan A. Suarez Romero jasuarez at igalia.com
Wed Nov 25 05:36:42 PST 2015


When analyzing output for glsl-mat-from-int-ctor-03 piglit test, found
that the following piece of generated asm code:

mov(8)          g19<1>.xyzF     g6<4,4,1>.xyzzD                 { align16 1Q };
dp4(8)          g115<1>.wF      g4<4,4,1>F      g2.4<0,4,1>F    { align16 NoDDChk 1Q };
cmp.nz.f0(8)    null<1>F        g11<4,4,1>.xyzzF g19<4,4,1>.xyzzF { align16 1Q switch };
cmp.nz.f0(8)    null<1>D        g7<4,4,1>D      0D              { align16 1Q switch };
(+f0.any4h) mov(8) g21<1>.xUD   0xffffffffUD                    { align16 1Q };

can be further optimized if we remove the former cmp instruction, as the
output is overwritten by the second one (a clearly dead-code).

The reason why this was not optimized is in vec4_visitor::run()
(brw_vec4.cpp file). If opt_vector_float() success, then we apply
several optimizations once, including a dead-code eliminate.

But turns out that running this DCE optimization leds to the code above,
and as we don't run again the DCE (we don't run them in a loop), the
code remains as above.

So this commit run all those optimizations in a loop. More strictly,
instead of running them in a separated loop, it runs them in the
previous loop, with all the other optimizations.

When testing against the improvement obtained against shader-db, we
don't get any improvement (nor any loose). But testing also against the
non-free shaders in shader-db, we get the following improvement:

total instructions in shared programs: 6819828 -> 6819468 (-0.01%)
instructions in affected programs:     30516 -> 30156 (-1.18%)
total loops in shared programs:        1971 -> 1971 (0.00%)
helped:                                154
HURT:                                  0
GAINED:                                0
LOST:                                  0

Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
---
 src/mesa/drivers/dri/i965/brw_vec4.cpp | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 9a79d67..39e525d 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -1846,19 +1846,15 @@ vec4_visitor::run()
       OPT(opt_copy_propagation);
       OPT(opt_cmod_propagation);
       OPT(opt_cse);
-      OPT(opt_algebraic);
       OPT(opt_register_coalesce);
       OPT(eliminate_find_live_channel);
-   } while (progress);
-
-   pass_num = 0;
-
-   if (OPT(opt_vector_float)) {
+      OPT(opt_algebraic);
+      OPT(opt_vector_float);
       OPT(opt_cse);
       OPT(opt_copy_propagation, false);
       OPT(opt_copy_propagation, true);
       OPT(dead_code_eliminate);
-   }
+   } while (progress);
 
    if (failed)
       return false;
-- 
2.5.0



More information about the mesa-dev mailing list