On Sat, 2015-09-05 at 02:21 -0700, Kenneth Graunke wrote: > Cuts compile/link time of the fragment shader in #91857 by 19% > (16.28 -> 13.05). > > I didn't bother with the acp sets because they're smaller, but it > might be worth doing as well. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91857 > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
Reviewed-by: Timothy Arceri <t_arc...@yahoo.com.au> > --- > src/glsl/opt_constant_propagation.cpp | 46 +++++++++++++++++++++----------- > --- > 1 file changed, 28 insertions(+), 18 deletions(-) > > diff --git a/src/glsl/opt_constant_propagation.cpp > b/src/glsl/opt_constant_propagation.cpp > index 5221417..184aaa1 100644 > --- a/src/glsl/opt_constant_propagation.cpp > +++ b/src/glsl/opt_constant_propagation.cpp > @@ -40,6 +40,7 @@ > #include "ir_basic_block.h" > #include "ir_optimization.h" > #include "glsl_types.h" > +#include "util/hash_table.h" > > namespace { > > @@ -95,7 +96,8 @@ public: > killed_all = false; > mem_ctx = ralloc_context(0); > this->acp = new(mem_ctx) exec_list; > - this->kills = new(mem_ctx) exec_list; > + this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer, > + _mesa_key_pointer_equal); > } > ~ir_constant_propagation_visitor() > { > @@ -123,7 +125,7 @@ public: > * List of kill_entry: The masks of variables whose values were > * killed in this block. > */ > - exec_list *kills; > + hash_table *kills; > > bool progress; > > @@ -263,11 +265,12 @@ > ir_constant_propagation_visitor::visit_enter(ir_function_signature *ir) > * main() at link time, so they're irrelevant to us. > */ > exec_list *orig_acp = this->acp; > - exec_list *orig_kills = this->kills; > + hash_table *orig_kills = this->kills; > bool orig_killed_all = this->killed_all; > > this->acp = new(mem_ctx) exec_list; > - this->kills = new(mem_ctx) exec_list; > + this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer, > + _mesa_key_pointer_equal); > this->killed_all = false; > > visit_list_elements(this, &ir->body); > @@ -352,11 +355,12 @@ void > ir_constant_propagation_visitor::handle_if_block(exec_list *instructions) > { > exec_list *orig_acp = this->acp; > - exec_list *orig_kills = this->kills; > + hash_table *orig_kills = this->kills; > bool orig_killed_all = this->killed_all; > > this->acp = new(mem_ctx) exec_list; > - this->kills = new(mem_ctx) exec_list; > + this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer, > + _mesa_key_pointer_equal); > this->killed_all = false; > > /* Populate the initial acp with a constant of the original */ > @@ -370,12 +374,14 @@ > ir_constant_propagation_visitor::handle_if_block(exec_list *instructions) > orig_acp->make_empty(); > } > > - exec_list *new_kills = this->kills; > + hash_table *new_kills = this->kills; > this->kills = orig_kills; > this->acp = orig_acp; > this->killed_all = this->killed_all || orig_killed_all; > > - foreach_in_list(kill_entry, k, new_kills) { > + hash_entry *htk; > + hash_table_foreach(new_kills, htk) { > + kill_entry *k = (kill_entry *) htk->data; > kill(k->var, k->write_mask); > } > } > @@ -397,7 +403,7 @@ ir_visitor_status > ir_constant_propagation_visitor::visit_enter(ir_loop *ir) > { > exec_list *orig_acp = this->acp; > - exec_list *orig_kills = this->kills; > + hash_table *orig_kills = this->kills; > bool orig_killed_all = this->killed_all; > > /* FINISHME: For now, the initial acp for loops is totally empty. > @@ -405,7 +411,8 @@ ir_constant_propagation_visitor::visit_enter(ir_loop > *ir) > * cloned minus the killed entries after the first run through. > */ > this->acp = new(mem_ctx) exec_list; > - this->kills = new(mem_ctx) exec_list; > + this->kills = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer, > + _mesa_key_pointer_equal); > this->killed_all = false; > > visit_list_elements(this, &ir->body_instructions); > @@ -414,12 +421,14 @@ ir_constant_propagation_visitor::visit_enter(ir_loop > *ir) > orig_acp->make_empty(); > } > > - exec_list *new_kills = this->kills; > + hash_table *new_kills = this->kills; > this->kills = orig_kills; > this->acp = orig_acp; > this->killed_all = this->killed_all || orig_killed_all; > > - foreach_in_list(kill_entry, k, new_kills) { > + hash_entry *htk; > + hash_table_foreach(new_kills, htk) { > + kill_entry *k = (kill_entry *) htk->data; > kill(k->var, k->write_mask); > } > > @@ -448,14 +457,15 @@ ir_constant_propagation_visitor::kill(ir_variable > *var, unsigned write_mask) > /* Add this writemask of the variable to the list of killed > * variables in this block. > */ > - foreach_in_list(kill_entry, entry, this->kills) { > - if (entry->var == var) { > - entry->write_mask |= write_mask; > - return; > - } > + hash_entry *kill_hash_entry = _mesa_hash_table_search(this->kills, var); > + if (kill_hash_entry) { > + kill_entry *entry = (kill_entry *) kill_hash_entry->data; > + entry->write_mask |= write_mask; > + return; > } > /* Not already in the list. Make new entry. */ > - this->kills->push_tail(new(this->mem_ctx) kill_entry(var, write_mask)); > + _mesa_hash_table_insert(this->kills, var, > + new(this->mem_ctx) kill_entry(var, write_mask)); > } > > /** _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev