summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-07-12 14:22:05 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-07-12 14:56:21 -0700
commit0b9ae3befb0bf80e000b159fd44c961a144f9c36 (patch)
treeb081c1b32309b708e8e40ffe3ed78738702f0dc1
parent288733f6001a2148d6689587d9a05e6909e88a61 (diff)
glsl2: Add declarations for temporaries to instruction stream
Temporary variables added for &&, ||, and ?: were not being added to the instruction stream. This resulted in either test failures or Valgrind being angry after the original IR tree was destroyed by talloc_free. The talloc_free caused the ir_variables to be destroyed even though they were still referenced.
-rw-r--r--src/glsl/ast_to_hir.cpp3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index e03bb6394fb..a9ab17f4216 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -821,6 +821,7 @@ ast_expression::hir(exec_list *instructions,
ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
"and_tmp");
+ instructions->push_tail(tmp);
ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp);
ir_assignment *const then_assign =
@@ -873,6 +874,7 @@ ast_expression::hir(exec_list *instructions,
ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
"or_tmp");
+ instructions->push_tail(tmp);
op[1] = this->subexpressions[1]->hir(&stmt->then_instructions, state);
@@ -1048,6 +1050,7 @@ ast_expression::hir(exec_list *instructions,
result = (cond_val->value.b[0]) ? then_val : else_val;
} else {
ir_variable *const tmp = new(ctx) ir_variable(type, "conditional_tmp");
+ instructions->push_tail(tmp);
ir_if *const stmt = new(ctx) ir_if(op[0]);
instructions->push_tail(stmt);