[Mesa-dev] [PATCH 3/3] glsl: Use hash tables for opt_constant_propagation() kill sets.

Timothy Arceri t_arceri at yahoo.com.au
Sat Sep 5 03:55:30 PDT 2015


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 <kenneth at whitecape.org>

Reviewed-by: Timothy Arceri <t_arceri at 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));
>  }
>  
>  /**


More information about the mesa-dev mailing list