glsl: Teach ir_variable_refcount about ir_loop::counter variables.

If an ir_loop has a non-null "counter" field, the variable referred to
by this field is implicitly read and written by the loop.  We need to
account for this in ir_variable_refcount, otherwise there is a danger
we will try to dead-code-eliminate the loop counter variable.

Note: at the moment the dead code elimination bug doesn't occur due to
a bug in ir_hierarchical_visitor: it doesn't visit the "counter"
field, so dead code elimination doesn't treat it as a candidate for
elimination.  But the patch to follow will fix that bug, so we need to
fix ir_variable_refcount first in order to avoid breaking dead code
elimination.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Paul Berry
2013-11-26 14:37:57 -08:00
parent 1fb106527f
commit 9d2951ea0a
2 changed files with 22 additions and 0 deletions
+21
View File
@@ -132,3 +132,24 @@ ir_variable_refcount_visitor::visit_leave(ir_assignment *ir)
return visit_continue;
}
ir_visitor_status
ir_variable_refcount_visitor::visit_leave(ir_loop *ir)
{
/* If the loop has a counter variable, it is implicitly referenced and
* assigned to. Note that since the LHS of an assignment is counted as a
* reference, we actually have to increment referenced_count by 2 so that
* later code will know that the variable isn't just assigned to.
*/
if (ir->counter != NULL) {
ir_variable_refcount_entry *entry =
this->get_variable_entry(ir->counter);
if (entry) {
entry->referenced_count += 2;
entry->assigned_count++;
}
}
return visit_continue;
}