[Mesa-stable] [PATCH 2/2] glsl: Don't copy propagate elements from SSBO or shared variables either

Ian Romanick idr at freedesktop.org
Tue Jun 12 22:48:14 UTC 2018


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

Since SSBOs can be written, copy propagating a read can cause the
value to magically change.  SSBO reads are also very expensive, so
doing it twice will be slower.

The same shader was helped by this patch and the previous.

Haswell, Broadwell, and Skylake had similar results. (Skylake shown)
total instructions in shared programs: 14399119 -> 14399113 (<.01%)
instructions in affected programs: 683 -> 677 (-0.88%)
helped: 1
HURT: 0

total cycles in shared programs: 532973113 -> 532971865 (<.01%)
cycles in affected programs: 524666 -> 523418 (-0.24%)
helped: 1
HURT: 0

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Cc: mesa-stable at lists.freedesktop.org
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106774
---
 src/compiler/glsl/opt_copy_propagation_elements.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/compiler/glsl/opt_copy_propagation_elements.cpp b/src/compiler/glsl/opt_copy_propagation_elements.cpp
index 8bae424a1d0..8975e727522 100644
--- a/src/compiler/glsl/opt_copy_propagation_elements.cpp
+++ b/src/compiler/glsl/opt_copy_propagation_elements.cpp
@@ -544,6 +544,10 @@ ir_copy_propagation_elements_visitor::add_copy(ir_assignment *ir)
    if (!lhs || !(lhs->type->is_scalar() || lhs->type->is_vector()))
       return;
 
+   if (lhs->var->data.mode == ir_var_shader_storage ||
+       lhs->var->data.mode == ir_var_shader_shared)
+      return;
+
    ir_dereference_variable *rhs = ir->rhs->as_dereference_variable();
    if (!rhs) {
       ir_swizzle *swiz = ir->rhs->as_swizzle();
@@ -560,6 +564,10 @@ ir_copy_propagation_elements_visitor::add_copy(ir_assignment *ir)
       orig_swizzle[3] = swiz->mask.w;
    }
 
+   if (rhs->var->data.mode == ir_var_shader_storage ||
+       rhs->var->data.mode == ir_var_shader_shared)
+      return;
+
    /* Move the swizzle channels out to the positions they match in the
     * destination.  We don't want to have to rewrite the swizzle[]
     * array every time we clear a bit of the write_mask.
-- 
2.14.4



More information about the mesa-stable mailing list