summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2011-06-24 12:20:09 -0700
committerEric Anholt <eric@anholt.net>2011-06-29 15:09:54 -0700
commit487dd96c2706aa352ed44637507dd7f38ac80306 (patch)
treeab780f3af8e51a41966f49664e6d20871eab2799
parent8fad8637ef42ccd064a4f90b090d8096ab968e58 (diff)
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>
-rw-r--r--src/glsl/lower_mat_op_to_vec.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/glsl/lower_mat_op_to_vec.cpp b/src/glsl/lower_mat_op_to_vec.cpp
index fe89802b086..9d593f9dd0e 100644
--- a/src/glsl/lower_mat_op_to_vec.cpp
+++ b/src/glsl/lower_mat_op_to_vec.cpp
@@ -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);