glsl2: Use the parser state as the talloc context for dead code elimination.
authorEric Anholt <eric@anholt.net>
Fri, 25 Jun 2010 20:38:38 +0000 (13:38 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 25 Jun 2010 20:38:38 +0000 (13:38 -0700)
This cuts runtime by around 20% from talloc_parent() lookups.

src/glsl/ir_dead_code.cpp
src/glsl/ir_optimization.h
src/glsl/main.cpp
src/mesa/shader/ir_to_mesa.cpp

index 882130468254e92d80d66a75cc41a7844571be32..51fa96df0cc5d1abf1e8183ea24be450c132e1c3 100644 (file)
@@ -71,6 +71,8 @@ public:
 
    /* List of variable_entry */
    exec_list variable_list;
+
+   void *mem_ctx;
 };
 
 
@@ -84,9 +86,7 @@ ir_dead_code_visitor::get_variable_entry(ir_variable *var)
         return entry;
    }
 
-   void *ctx = talloc_parent(var);
-
-   variable_entry *entry = new(ctx) variable_entry(var);
+   variable_entry *entry = new(mem_ctx) variable_entry(var);
    this->variable_list.push_tail(entry);
    return entry;
 }
@@ -147,11 +147,13 @@ ir_dead_code_visitor::visit_leave(ir_assignment *ir)
  * for usage on an unlinked instruction stream.
  */
 bool
-do_dead_code(exec_list *instructions)
+do_dead_code(struct _mesa_glsl_parse_state *state,
+            exec_list *instructions)
 {
    ir_dead_code_visitor v;
    bool progress = false;
 
+   v.mem_ctx = state;
    v.run(instructions);
 
    foreach_iter(exec_list_iterator, iter, v.variable_list) {
@@ -198,7 +200,8 @@ do_dead_code(exec_list *instructions)
  * with global scope.
  */
 bool
-do_dead_code_unlinked(exec_list *instructions)
+do_dead_code_unlinked(struct _mesa_glsl_parse_state *state,
+                     exec_list *instructions)
 {
    bool progress = false;
 
@@ -209,7 +212,7 @@ do_dead_code_unlinked(exec_list *instructions)
         foreach_iter(exec_list_iterator, sigiter, *f) {
            ir_function_signature *sig =
               (ir_function_signature *) sigiter.get();
-           if (do_dead_code(&sig->body))
+           if (do_dead_code(state, &sig->body))
               progress = true;
         }
       }
index 432a33458c2d0fb7a3f9190b59acebf7369ed754..147f92176bf5c2a72af34109dd8e0d133eefb9c8 100644 (file)
@@ -32,9 +32,11 @@ bool do_constant_folding(exec_list *instructions);
 bool do_constant_variable(exec_list *instructions);
 bool do_constant_variable_unlinked(exec_list *instructions);
 bool do_copy_propagation(exec_list *instructions);
-bool do_dead_code(exec_list *instructions);
+bool do_dead_code(struct _mesa_glsl_parse_state *state,
+                 exec_list *instructions);
 bool do_dead_code_local(exec_list *instructions);
-bool do_dead_code_unlinked(exec_list *instructions);
+bool do_dead_code_unlinked(struct _mesa_glsl_parse_state *state,
+                          exec_list *instructions);
 bool do_function_inlining(exec_list *instructions);
 bool do_if_simplification(exec_list *instructions);
 bool do_swizzle_swizzle(exec_list *instructions);
index dcd9bd69c0cf1c79dcedbcd5d8d785819af0dbc8..b32e2ad3dbc6c3cb9b91e7595a2fca34f3c38dd9 100644 (file)
@@ -157,7 +157,7 @@ compile_shader(struct glsl_shader *shader)
         progress = do_if_simplification(&shader->ir) || progress;
         progress = do_copy_propagation(&shader->ir) || progress;
         progress = do_dead_code_local(&shader->ir) || progress;
-        progress = do_dead_code_unlinked(&shader->ir) || progress;
+        progress = do_dead_code_unlinked(state, &shader->ir) || progress;
         progress = do_constant_variable_unlinked(&shader->ir) || progress;
         progress = do_constant_folding(&shader->ir) || progress;
         progress = do_vec_index_to_swizzle(&shader->ir) || progress;
index f58af0f65f5be7139577d3d8272629c4285d058c..0425e7d91ea505f4d1a2029a0eb87dc1e34000a8 100644 (file)
@@ -1332,7 +1332,7 @@ _mesa_get_glsl_shader(GLcontext *ctx, void *mem_ctx, struct gl_shader *sh)
         progress = do_if_simplification(&shader->ir) || progress;
         progress = do_copy_propagation(&shader->ir) || progress;
         progress = do_dead_code_local(&shader->ir) || progress;
-        progress = do_dead_code_unlinked(&shader->ir) || progress;
+        progress = do_dead_code_unlinked(state, &shader->ir) || progress;
         progress = do_constant_variable_unlinked(&shader->ir) || progress;
         progress = do_constant_folding(&shader->ir) || progress;
         progress = do_vec_index_to_swizzle(&shader->ir) || progress;