Mesa (master): glsl/opt_cpe: Kill when the assignment isn' t something we recognize.

Eric Anholt anholt at kemper.freedesktop.org
Wed Apr 13 17:53:41 UTC 2011


Module: Mesa
Branch: master
Commit: 487debfda56ad3855db655688186401b0dd75233
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=487debfda56ad3855db655688186401b0dd75233

Author: Eric Anholt <eric at anholt.net>
Date:   Sat Apr  2 20:17:17 2011 -0700

glsl/opt_cpe: Kill when the assignment isn't something we recognize.

A few GLES2 tests tripped over this when using array dereferences to
hit channels on the LHS (see piglit test
glsl-copy-propagation-vector-indexing).  We wouldn't find the
ir_dereference_variable, and assume that that meant that it wasn't an
assignment to a scalar/vector, and thus not notice that the variable
had been changed.

---

 src/glsl/opt_copy_propagation_elements.cpp |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/glsl/opt_copy_propagation_elements.cpp b/src/glsl/opt_copy_propagation_elements.cpp
index 8541d9a..1ffbd4d 100644
--- a/src/glsl/opt_copy_propagation_elements.cpp
+++ b/src/glsl/opt_copy_propagation_elements.cpp
@@ -161,9 +161,16 @@ ir_visitor_status
 ir_copy_propagation_elements_visitor::visit_leave(ir_assignment *ir)
 {
    ir_dereference_variable *lhs = ir->lhs->as_dereference_variable();
+   ir_variable *var = ir->lhs->variable_referenced();
+
+   if (var->type->is_scalar() || var->type->is_vector()) {
+      kill_entry *k;
+
+      if (lhs)
+	 k = new(mem_ctx) kill_entry(var, ir->write_mask);
+      else
+	 k = new(mem_ctx) kill_entry(var, ~0);
 
-   if (lhs && (lhs->type->is_scalar() || lhs->type->is_vector())) {
-      kill_entry *k = new(mem_ctx) kill_entry(lhs->var, ir->write_mask);
       kill(k);
    }
 




More information about the mesa-commit mailing list