Mesa (master): glsl: Use hash table cloning in copy propagation

Thomas Helland thomhell at kemper.freedesktop.org
Wed Mar 14 18:52:30 UTC 2018


Module: Mesa
Branch: master
Commit: 5f129c05e698157c4481cd1e80a4a1b2f43ef96c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5f129c05e698157c4481cd1e80a4a1b2f43ef96c

Author: Thomas Helland <thomashelland90 at gmail.com>
Date:   Mon Jan  9 23:14:46 2017 +0100

glsl: Use hash table cloning in copy propagation

Walking the whole hash table, inserting entries by hashing them first
is just a really bad idea. We can simply memcpy the whole thing.

V2: Remove leftover creation of acp in two places

Reviewed-by: Eric Anholt <eric at anholt.net>
Reviewed-by: Emil Velikov <emil.velikov at collabora.com>

---

 src/compiler/glsl/opt_copy_propagation.cpp         | 17 ++++---------
 .../glsl/opt_copy_propagation_elements.cpp         | 29 ++++++++--------------
 2 files changed, 15 insertions(+), 31 deletions(-)

diff --git a/src/compiler/glsl/opt_copy_propagation.cpp b/src/compiler/glsl/opt_copy_propagation.cpp
index e904e6ede4..6220aa86da 100644
--- a/src/compiler/glsl/opt_copy_propagation.cpp
+++ b/src/compiler/glsl/opt_copy_propagation.cpp
@@ -213,17 +213,12 @@ ir_copy_propagation_visitor::handle_if_block(exec_list *instructions)
    set *orig_kills = this->kills;
    bool orig_killed_all = this->killed_all;
 
-   acp = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
-                                 _mesa_key_pointer_equal);
    kills = _mesa_set_create(NULL, _mesa_hash_pointer,
                             _mesa_key_pointer_equal);
    this->killed_all = false;
 
    /* Populate the initial acp with a copy of the original */
-   struct hash_entry *entry;
-   hash_table_foreach(orig_acp, entry) {
-      _mesa_hash_table_insert(acp, entry->key, entry->data);
-   }
+   acp = _mesa_hash_table_clone(orig_acp, NULL);
 
    visit_list_elements(this, instructions);
 
@@ -264,17 +259,15 @@ ir_copy_propagation_visitor::handle_loop(ir_loop *ir, bool keep_acp)
    set *orig_kills = this->kills;
    bool orig_killed_all = this->killed_all;
 
-   acp = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
-                                 _mesa_key_pointer_equal);
    kills = _mesa_set_create(NULL, _mesa_hash_pointer,
                             _mesa_key_pointer_equal);
    this->killed_all = false;
 
    if (keep_acp) {
-      struct hash_entry *entry;
-      hash_table_foreach(orig_acp, entry) {
-         _mesa_hash_table_insert(acp, entry->key, entry->data);
-      }
+      acp = _mesa_hash_table_clone(orig_acp, NULL);
+   } else {
+      acp = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
+                                    _mesa_key_pointer_equal);
    }
 
    visit_list_elements(this, &ir->body_instructions);
diff --git a/src/compiler/glsl/opt_copy_propagation_elements.cpp b/src/compiler/glsl/opt_copy_propagation_elements.cpp
index 9f79fa9202..8bae424a1d 100644
--- a/src/compiler/glsl/opt_copy_propagation_elements.cpp
+++ b/src/compiler/glsl/opt_copy_propagation_elements.cpp
@@ -124,6 +124,12 @@ public:
       ralloc_free(mem_ctx);
    }
 
+   void clone_acp(hash_table *lhs, hash_table *rhs)
+   {
+      lhs_ht = _mesa_hash_table_clone(lhs, mem_ctx);
+      rhs_ht = _mesa_hash_table_clone(rhs, mem_ctx);
+   }
+
    void create_acp()
    {
       lhs_ht = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
@@ -138,19 +144,6 @@ public:
       _mesa_hash_table_destroy(rhs_ht, NULL);
    }
 
-   void populate_acp(hash_table *lhs, hash_table *rhs)
-   {
-      struct hash_entry *entry;
-
-      hash_table_foreach(lhs, entry) {
-         _mesa_hash_table_insert(lhs_ht, entry->key, entry->data);
-      }
-
-      hash_table_foreach(rhs, entry) {
-         _mesa_hash_table_insert(rhs_ht, entry->key, entry->data);
-      }
-   }
-
    void handle_loop(ir_loop *, bool keep_acp);
    virtual ir_visitor_status visit_enter(class ir_loop *);
    virtual ir_visitor_status visit_enter(class ir_function_signature *);
@@ -395,10 +388,8 @@ ir_copy_propagation_elements_visitor::handle_if_block(exec_list *instructions)
    this->kills = new(mem_ctx) exec_list;
    this->killed_all = false;
 
-   create_acp();
-
    /* Populate the initial acp with a copy of the original */
-   populate_acp(orig_lhs_ht, orig_rhs_ht);
+   clone_acp(orig_lhs_ht, orig_rhs_ht);
 
    visit_list_elements(this, instructions);
 
@@ -454,11 +445,11 @@ ir_copy_propagation_elements_visitor::handle_loop(ir_loop *ir, bool keep_acp)
    this->kills = new(mem_ctx) exec_list;
    this->killed_all = false;
 
-   create_acp();
-
    if (keep_acp) {
       /* Populate the initial acp with a copy of the original */
-      populate_acp(orig_lhs_ht, orig_rhs_ht);
+      clone_acp(orig_lhs_ht, orig_rhs_ht);
+   } else {
+      create_acp();
    }
 
    visit_list_elements(this, &ir->body_instructions);




More information about the mesa-commit mailing list