glsl: Avoid making a temporary for lower_mat_op_to_vec if not needed.
authorEric Anholt <eric@anholt.net>
Fri, 24 Jun 2011 19:20:09 +0000 (12:20 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 29 Jun 2011 22:09:54 +0000 (15:09 -0700)
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>
src/glsl/lower_mat_op_to_vec.cpp

index fe89802b086e2980300348d5b6fc6ea35cb3c31d..9d593f9dd0efbf7891ecbd78ca4753d907a4bd25 100644 (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);