[Mesa-dev] [PATCH v2 4/4] i965/vec4: Use nir_move_vec_src_uses_to_dest

Jason Ekstrand jason at jlekstrand.net
Tue Sep 15 13:44:09 PDT 2015


The idea here is not that it gives register coalescing a little bit of a
helping hand.  It doesn't actually fix the coalescing problems, but it
seems to help a good bit.

Shader-db results for vec4 programs on Haswell:

   total instructions in shared programs: 1746280 -> 1683959 (-3.57%)
   instructions in affected programs:     1259166 -> 1196845 (-4.95%)
   helped:                                11363
   HURT:                                  148

v2 (Jason Ekstrand):
 - Run nir_move_vec_src_uses_to_dest after going out of SSA
 - New shader-db numbers
---
 src/glsl/nir/nir_move_vec_src_uses_to_dest.c | 16 ++++++++++++----
 src/mesa/drivers/dri/i965/brw_nir.c          |  2 ++
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/glsl/nir/nir_move_vec_src_uses_to_dest.c b/src/glsl/nir/nir_move_vec_src_uses_to_dest.c
index 6e248a2..4c9032d 100644
--- a/src/glsl/nir/nir_move_vec_src_uses_to_dest.c
+++ b/src/glsl/nir/nir_move_vec_src_uses_to_dest.c
@@ -79,17 +79,23 @@ move_vec_src_uses_to_dest_block(nir_block *block, void *shader)
          continue; /* The loop */
       }
 
+      /* Can't handle non-SSA vec operations */
+      if (!vec->dest.dest.is_ssa)
+         continue;
+
       /* Can't handle saturation */
       if (vec->dest.saturate)
          continue;
 
-      assert(vec->dest.dest.is_ssa);
-
       /* First, mark all of the sources we are going to consider for rewriting
        * to the destination
        */
       int srcs_remaining = 0;
       for (unsigned i = 0; i < nir_op_infos[vec->op].num_inputs; i++) {
+         /* We can't rewrite a source if it's not in SSA form */
+         if (!vec->src[i].src.is_ssa)
+            continue;
+
          /* We can't rewrite a source if it has modifiers */
          if (vec->src[i].abs || vec->src[i].negate)
             continue;
@@ -97,9 +103,11 @@ move_vec_src_uses_to_dest_block(nir_block *block, void *shader)
          srcs_remaining |= 1 << i;
       }
 
-      for (unsigned i; i = ffs(srcs_remaining) - 1, srcs_remaining;) {
-         assert(vec->src[i].src.is_ssa);
+      /* We can't actually do anything with this instruction */
+      if (srcs_remaining == 0)
+         continue;
 
+      for (unsigned i; i = ffs(srcs_remaining) - 1, srcs_remaining;) {
          int8_t swizzle[4] = { -1, -1, -1, -1 };
 
          for (unsigned j = i; j < nir_op_infos[vec->op].num_inputs; j++) {
diff --git a/src/mesa/drivers/dri/i965/brw_nir.c b/src/mesa/drivers/dri/i965/brw_nir.c
index f326b23..8568988 100644
--- a/src/mesa/drivers/dri/i965/brw_nir.c
+++ b/src/mesa/drivers/dri/i965/brw_nir.c
@@ -187,6 +187,8 @@ brw_create_nir(struct brw_context *brw,
    nir_validate_shader(nir);
 
    if (!is_scalar) {
+      nir_move_vec_src_uses_to_dest(nir);
+      nir_validate_shader(nir);
       nir_lower_vec_to_movs(nir);
       nir_validate_shader(nir);
    }
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list