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