glsl2: Add declarations for temporaries to instruction stream
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 12 Jul 2010 21:22:05 +0000 (14:22 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 12 Jul 2010 21:56:21 +0000 (14:56 -0700)
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.

src/glsl/ast_to_hir.cpp

index e03bb6394fbe8a20b7ffd82d0b9bd54b0444ddbb..a9ab17f4216e2458ee6c0992583c58c2aca81de0 100644 (file)
@@ -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);