glsl: Avoid making a temporary for lower_mat_op_to_vec if not needed.

Our copy propagation tends to be bad at handling the later array
accesses of the matrix argument we moved to a temporary.  Generally we
don't need to move it to a temporary, though, so this avoids needing
more copy propagation complexity.

Reduces instruction count of some Unigine Tropics and Sanctuary
fragment shaders that do operations on uniform matrix arrays by 5.9%
on gen6.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Eric Anholt 2011-06-24 12:20:09 -07:00
parent 8fad8637ef
commit 487dd96c27

View file

@ -329,7 +329,18 @@ ir_mat_op_to_vec_visitor::visit_leave(ir_assignment *orig_assign)
*/
for (i = 0; i < orig_expr->get_num_operands(); i++) {
ir_assignment *assign;
ir_dereference *deref = orig_expr->operands[i]->as_dereference();
/* Avoid making a temporary if we don't need to to avoid aliasing. */
if (deref &&
deref->variable_referenced() != result->variable_referenced()) {
op[i] = deref;
continue;
}
/* Otherwise, store the operand in a temporary generally if it's
* not a dereference.
*/
ir_variable *var = new(mem_ctx) ir_variable(orig_expr->operands[i]->type,
"mat_op_to_vec",
ir_var_temporary);