[Mesa-dev] [PATCH 04/18] glsl: Port copy propagation elements to pointer map
Thomas Helland
thomashelland90 at gmail.com
Wed Apr 11 18:48:13 UTC 2018
---
.../glsl/opt_copy_propagation_elements.cpp | 96 +++++++++++-----------
1 file changed, 47 insertions(+), 49 deletions(-)
diff --git a/src/compiler/glsl/opt_copy_propagation_elements.cpp b/src/compiler/glsl/opt_copy_propagation_elements.cpp
index 8bae424a1d..8737fe27a5 100644
--- a/src/compiler/glsl/opt_copy_propagation_elements.cpp
+++ b/src/compiler/glsl/opt_copy_propagation_elements.cpp
@@ -46,7 +46,7 @@
#include "ir_basic_block.h"
#include "ir_optimization.h"
#include "compiler/glsl_types.h"
-#include "util/hash_table.h"
+#include "util/pointer_map.h"
static bool debug = false;
@@ -124,24 +124,22 @@ public:
ralloc_free(mem_ctx);
}
- void clone_acp(hash_table *lhs, hash_table *rhs)
+ void clone_acp(pointer_map *lhs, pointer_map *rhs)
{
- lhs_ht = _mesa_hash_table_clone(lhs, mem_ctx);
- rhs_ht = _mesa_hash_table_clone(rhs, mem_ctx);
+ lhs_pm = _mesa_pointer_map_clone(lhs, mem_ctx);
+ rhs_pm = _mesa_pointer_map_clone(rhs, mem_ctx);
}
void create_acp()
{
- lhs_ht = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
- _mesa_key_pointer_equal);
- rhs_ht = _mesa_hash_table_create(mem_ctx, _mesa_hash_pointer,
- _mesa_key_pointer_equal);
+ lhs_pm = _mesa_pointer_map_create(mem_ctx);
+ rhs_pm = _mesa_pointer_map_create(mem_ctx);
}
void destroy_acp()
{
- _mesa_hash_table_destroy(lhs_ht, NULL);
- _mesa_hash_table_destroy(rhs_ht, NULL);
+ _mesa_pointer_map_destroy(lhs_pm, NULL);
+ _mesa_pointer_map_destroy(rhs_pm, NULL);
}
void handle_loop(ir_loop *, bool keep_acp);
@@ -159,8 +157,8 @@ public:
void handle_if_block(exec_list *instructions);
/** Hash of acp_entry: The available copies to propagate */
- hash_table *lhs_ht;
- hash_table *rhs_ht;
+ pointer_map *lhs_pm;
+ pointer_map *rhs_pm;
/**
* List of kill_entry: The variables whose values were killed in this
@@ -191,8 +189,8 @@ ir_copy_propagation_elements_visitor::visit_enter(ir_function_signature *ir)
exec_list *orig_kills = this->kills;
bool orig_killed_all = this->killed_all;
- hash_table *orig_lhs_ht = lhs_ht;
- hash_table *orig_rhs_ht = rhs_ht;
+ pointer_map *orig_lhs_pm = lhs_pm;
+ pointer_map *orig_rhs_pm = rhs_pm;
this->kills = new(mem_ctx) exec_list;
this->killed_all = false;
@@ -208,8 +206,8 @@ ir_copy_propagation_elements_visitor::visit_enter(ir_function_signature *ir)
this->kills = orig_kills;
this->killed_all = orig_killed_all;
- lhs_ht = orig_lhs_ht;
- rhs_ht = orig_rhs_ht;
+ lhs_pm = orig_lhs_pm;
+ rhs_pm = orig_rhs_pm;
return visit_continue_with_parent;
}
@@ -296,9 +294,9 @@ ir_copy_propagation_elements_visitor::handle_rvalue(ir_rvalue **ir)
/* Try to find ACP entries covering swizzle_chan[], hoping they're
* the same source variable.
*/
- hash_entry *ht_entry = _mesa_hash_table_search(lhs_ht, var);
- if (ht_entry) {
- exec_list *ht_list = (exec_list *) ht_entry->data;
+ map_entry *pm_entry = _mesa_pointer_map_search(lhs_pm, var);
+ if (pm_entry) {
+ exec_list *ht_list = (exec_list *) pm_entry->data;
foreach_in_list(acp_entry, entry, ht_list) {
for (int c = 0; c < chans; c++) {
if (entry->write_mask & (1 << swizzle_chan[c])) {
@@ -368,8 +366,8 @@ ir_copy_propagation_elements_visitor::visit_enter(ir_call *ir)
/* Since we're unlinked, we don't (necessarily) know the side effects of
* this call. So kill all copies.
*/
- _mesa_hash_table_clear(lhs_ht, NULL);
- _mesa_hash_table_clear(rhs_ht, NULL);
+ _mesa_pointer_map_clear(lhs_pm);
+ _mesa_pointer_map_clear(rhs_pm);
this->killed_all = true;
@@ -382,20 +380,20 @@ ir_copy_propagation_elements_visitor::handle_if_block(exec_list *instructions)
exec_list *orig_kills = this->kills;
bool orig_killed_all = this->killed_all;
- hash_table *orig_lhs_ht = lhs_ht;
- hash_table *orig_rhs_ht = rhs_ht;
+ pointer_map *orig_lhs_pm = lhs_pm;
+ pointer_map *orig_rhs_pm = rhs_pm;
this->kills = new(mem_ctx) exec_list;
this->killed_all = false;
/* Populate the initial acp with a copy of the original */
- clone_acp(orig_lhs_ht, orig_rhs_ht);
+ clone_acp(orig_lhs_pm, orig_rhs_pm);
visit_list_elements(this, instructions);
if (this->killed_all) {
- _mesa_hash_table_clear(orig_lhs_ht, NULL);
- _mesa_hash_table_clear(orig_rhs_ht, NULL);
+ _mesa_pointer_map_clear(orig_lhs_pm);
+ _mesa_pointer_map_clear(orig_rhs_pm);
}
exec_list *new_kills = this->kills;
@@ -404,8 +402,8 @@ ir_copy_propagation_elements_visitor::handle_if_block(exec_list *instructions)
destroy_acp();
- lhs_ht = orig_lhs_ht;
- rhs_ht = orig_rhs_ht;
+ lhs_pm = orig_lhs_pm;
+ rhs_pm = orig_rhs_pm;
/* Move the new kills into the parent block's list, removing them
* from the parent's ACP list in the process.
@@ -435,8 +433,8 @@ ir_copy_propagation_elements_visitor::handle_loop(ir_loop *ir, bool keep_acp)
exec_list *orig_kills = this->kills;
bool orig_killed_all = this->killed_all;
- hash_table *orig_lhs_ht = lhs_ht;
- hash_table *orig_rhs_ht = rhs_ht;
+ pointer_map *orig_lhs_pm = lhs_pm;
+ pointer_map *orig_rhs_pm = rhs_pm;
/* FINISHME: For now, the initial acp for loops is totally empty.
* We could go through once, then go through again with the acp
@@ -447,7 +445,7 @@ ir_copy_propagation_elements_visitor::handle_loop(ir_loop *ir, bool keep_acp)
if (keep_acp) {
/* Populate the initial acp with a copy of the original */
- clone_acp(orig_lhs_ht, orig_rhs_ht);
+ clone_acp(orig_lhs_pm, orig_rhs_pm);
} else {
create_acp();
}
@@ -455,8 +453,8 @@ ir_copy_propagation_elements_visitor::handle_loop(ir_loop *ir, bool keep_acp)
visit_list_elements(this, &ir->body_instructions);
if (this->killed_all) {
- _mesa_hash_table_clear(orig_lhs_ht, NULL);
- _mesa_hash_table_clear(orig_rhs_ht, NULL);
+ _mesa_pointer_map_clear(orig_lhs_pm);
+ _mesa_pointer_map_clear(orig_rhs_pm);
}
exec_list *new_kills = this->kills;
@@ -465,8 +463,8 @@ ir_copy_propagation_elements_visitor::handle_loop(ir_loop *ir, bool keep_acp)
destroy_acp();
- lhs_ht = orig_lhs_ht;
- rhs_ht = orig_rhs_ht;
+ lhs_pm = orig_lhs_pm;
+ rhs_pm = orig_rhs_pm;
foreach_in_list_safe(kill_entry, k, new_kills) {
kill(k);
@@ -490,9 +488,9 @@ void
ir_copy_propagation_elements_visitor::kill(kill_entry *k)
{
/* removal of lhs entries */
- hash_entry *ht_entry = _mesa_hash_table_search(lhs_ht, k->var);
- if (ht_entry) {
- exec_list *lhs_list = (exec_list *) ht_entry->data;
+ map_entry *pm_entry = _mesa_pointer_map_search(lhs_pm, k->var);
+ if (pm_entry) {
+ exec_list *lhs_list = (exec_list *) pm_entry->data;
foreach_in_list_safe(acp_entry, entry, lhs_list) {
entry->write_mask = entry->write_mask & ~k->write_mask;
if (entry->write_mask == 0) {
@@ -503,9 +501,9 @@ ir_copy_propagation_elements_visitor::kill(kill_entry *k)
}
/* removal of rhs entries */
- ht_entry = _mesa_hash_table_search(rhs_ht, k->var);
- if (ht_entry) {
- exec_list *rhs_list = (exec_list *) ht_entry->data;
+ pm_entry = _mesa_pointer_map_search(rhs_pm, k->var);
+ if (pm_entry) {
+ exec_list *rhs_list = (exec_list *) pm_entry->data;
acp_ref *ref;
while ((ref = (acp_ref *) rhs_list->pop_head()) != NULL) {
@@ -590,25 +588,25 @@ ir_copy_propagation_elements_visitor::add_copy(ir_assignment *ir)
swizzle);
/* lhs hash, hash of lhs -> acp_entry lists */
- hash_entry *ht_entry = _mesa_hash_table_search(lhs_ht, lhs->var);
- if (ht_entry) {
- exec_list *lhs_list = (exec_list *) ht_entry->data;
+ map_entry *pm_entry = _mesa_pointer_map_search(lhs_pm, lhs->var);
+ if (pm_entry) {
+ exec_list *lhs_list = (exec_list *) pm_entry->data;
lhs_list->push_tail(entry);
} else {
exec_list *lhs_list = new(mem_ctx) exec_list;
lhs_list->push_tail(entry);
- _mesa_hash_table_insert(lhs_ht, lhs->var, lhs_list);
+ _mesa_pointer_map_insert(lhs_pm, lhs->var, lhs_list);
}
/* rhs hash, hash of rhs -> acp_entry pointers to lhs lists */
- ht_entry = _mesa_hash_table_search(rhs_ht, rhs->var);
- if (ht_entry) {
- exec_list *rhs_list = (exec_list *) ht_entry->data;
+ pm_entry = _mesa_pointer_map_search(rhs_pm, rhs->var);
+ if (pm_entry) {
+ exec_list *rhs_list = (exec_list *) pm_entry->data;
rhs_list->push_tail(&entry->rhs_node);
} else {
exec_list *rhs_list = new(mem_ctx) exec_list;
rhs_list->push_tail(&entry->rhs_node);
- _mesa_hash_table_insert(rhs_ht, rhs->var, rhs_list);
+ _mesa_pointer_map_insert(rhs_pm, rhs->var, rhs_list);
}
}
--
2.16.2
More information about the mesa-dev
mailing list