glsl/opt_cpe: Kill when the assignment isn't something we recognize.
authorEric Anholt <eric@anholt.net>
Sun, 3 Apr 2011 03:17:17 +0000 (20:17 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 13 Apr 2011 17:51:03 +0000 (10:51 -0700)
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

index 8541d9a8ee1ca80904b1e261047242211a844f84..1ffbd4da14457a3a9eda310cdbaca3c44a96b994 100644 (file)
@@ -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);
    }