[Mesa-dev] [PATCH 06/22] glsl: Lower vector indexing to conditional-select instead of conditional-assign

Ian Romanick idr at freedesktop.org
Thu Sep 21 14:34:19 UTC 2017


From: "\"Ian Romanick\"" <idr at freedesktop.org>

From: Ian Romanick <ian.d.romanick at intel.com>

This changes the generated GLSL IR from something like

    bvec4 eq = equal(vec4(index), vec4(0, 1, 2, 3));
    if (eq.x)
        lhs = rhs.x;
    if (eq.y)
        lhs = rhs.y;
    if (eq.z)
        lhs = rhs.z;
    if (eq.w)
        lhs = rhs.w;

to something like

    bvec4 eq = equal(vec4(index), vec4(0, 1, 2, 3));

    lhs = eq.x ? rhs.x : rhs.y;
    lhs = eq.z ? rhs.z : lhs;
    lhs = eq.w ? rhs.w : lhs;

Now the comparison of the index with 1 is dead.

shader-db changes:

G4X / Iron Lake:

total instructions in shared programs: 4511136 -> 4511200 (0.00%)
instructions in affected programs: 6539 -> 6603 (0.98%)
helped: 0
HURT: 64

total cycles in shared programs: 108337124 -> 108337252 (0.00%)
cycles in affected programs: 112868 -> 112996 (0.11%)
helped: 0
HURT: 64

Sandy Bridge:

total instructions in shared programs: 9852966 -> 9853030 (0.00%)
instructions in affected programs: 5550 -> 5614 (1.15%)
helped: 0
HURT: 64

total cycles in shared programs: 139567270 -> 139567394 (0.00%)
cycles in affected programs: 26992 -> 27116 (0.46%)
helped: 3
HURT: 37

Ivybridge:

total instructions in shared programs: 9119649 -> 9119713 (0.00%)
instructions in affected programs: 5325 -> 5389 (1.20%)
helped: 0
HURT: 64

total cycles in shared programs: 81708934 -> 81709020 (0.00%)
cycles in affected programs: 10446 -> 10532 (0.82%)
helped: 0
HURT: 18

Haswell:

total instructions in shared programs: 8301165 -> 8301229 (0.00%)
instructions in affected programs: 5325 -> 5389 (1.20%)
helped: 0
HURT: 64

total cycles in shared programs: 79526732 -> 79526806 (0.00%)
cycles in affected programs: 5262 -> 5336 (1.41%)
helped: 0
HURT: 11

Broadwell and Skylake:

total instructions in shared programs: 13511867 -> 13504225 (-0.06%)
instructions in affected programs: 100680 -> 93038 (-7.59%)
helped: 86
HURT: 0

total cycles in shared programs: 544335160 -> 540320834 (-0.74%)
cycles in affected programs: 56615030 -> 52600704 (-7.09%)
helped: 43
HURT: 36

total spills in shared programs: 85420 -> 84334 (-1.27%)
spills in affected programs: 3099 -> 2013 (-35.04%)
helped: 27
HURT: 0

total fills in shared programs: 88695 -> 87427 (-1.43%)
fills in affected programs: 3850 -> 2582 (-32.94%)
helped: 27
HURT: 0

The spill / fills helped were all in Dolphin uber shaders.  In some
cases this change was 86 -> 14.  That accounts for a ton of cycles.  I
have not investigated any of these changes beyond this.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 .../glsl/lower_vec_index_to_cond_assign.cpp   | 29 +++++++++++++++++--
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp b/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp
index 926a493..2053342 100644
--- a/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp
+++ b/src/compiler/glsl/lower_vec_index_to_cond_assign.cpp
@@ -112,9 +112,32 @@ ir_vec_index_to_cond_assign_visitor::convert_vec_index_to_cond_assign(void *mem_
                           orig_vector->type->vector_elements,
                           mem_ctx);
 
-   /* Generate a conditional move of each vector element to the temp. */
-   for (unsigned i = 0; i < orig_vector->type->vector_elements; i++)
-      body.emit(assign(var, swizzle(value, i, 1), swizzle(cond, i, 1)));
+   /* The swizzle must be 0, 1, 2, or 3.  Generate an initial conditional
+    * select like
+    *
+    *    var = (i == 0) ? value.x : value.y;
+    *
+    * For vectors larger than 2 elements, generate additional conditional
+    * selects like:
+    *
+    *    var = (i == 2) ? value.z : var;
+    *    var = (i == 3) ? value.w : var;
+    */
+   body.emit(assign(var, csel(swizzle_x(cond),
+                              swizzle_x(value),
+                              swizzle_y(value))));
+
+   if (orig_vector->type->vector_elements > 2) {
+      body.emit(assign(var, csel(swizzle_z(cond),
+                                 swizzle_z(value),
+                                 var)));
+   }
+
+   if (orig_vector->type->vector_elements > 3) {
+      body.emit(assign(var, csel(swizzle_w(cond),
+                                 swizzle_w(value),
+                                 var)));
+   }
 
    /* Put all of the new instructions in the IR stream before the old
     * instruction.
-- 
2.9.5



More information about the mesa-dev mailing list