On Thu, 2016-12-15 at 20:10 -0800, Ian Romanick wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > Very soon this visitor will get more complicated. The users of the > existing ir_variable_refcount visitor won't need the coming > functionality, and this use doesn't need much of the functionality of > ir_variable_refcount. > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > Cc: mesa-sta...@lists.freedesktop.org > --- > src/compiler/Makefile.sources | 2 + > src/compiler/glsl/ir_array_refcount.cpp | 100 > ++++++++++++++++++++++++++++++++ > src/compiler/glsl/ir_array_refcount.h | 65 +++++++++++++++++++++ > src/compiler/glsl/link_uniforms.cpp | 10 ++-- > 4 files changed, 172 insertions(+), 5 deletions(-) > create mode 100644 src/compiler/glsl/ir_array_refcount.cpp > create mode 100644 src/compiler/glsl/ir_array_refcount.h > > diff --git a/src/compiler/Makefile.sources > b/src/compiler/Makefile.sources > index 17b15de..15f410f 100644 > --- a/src/compiler/Makefile.sources > +++ b/src/compiler/Makefile.sources > @@ -29,6 +29,8 @@ LIBGLSL_FILES = \ > glsl/glsl_to_nir.cpp \ > glsl/glsl_to_nir.h \ > glsl/hir_field_selection.cpp \ > + glsl/ir_array_refcount.cpp \ > + glsl/ir_array_refcount.h \ > glsl/ir_basic_block.cpp \ > glsl/ir_basic_block.h \ > glsl/ir_builder.cpp \ > diff --git a/src/compiler/glsl/ir_array_refcount.cpp > b/src/compiler/glsl/ir_array_refcount.cpp > new file mode 100644 > index 0000000..41a0914 > --- /dev/null > +++ b/src/compiler/glsl/ir_array_refcount.cpp > @@ -0,0 +1,100 @@ > +/* > + * Copyright © 2016 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person > obtaining a > + * copy of this software and associated documentation files (the > "Software"), > + * to deal in the Software without restriction, including without > limitation > + * the rights to use, copy, modify, merge, publish, distribute, > sublicense, > + * and/or sell copies of the Software, and to permit persons to whom > the > + * Software is furnished to do so, subject to the following > conditions: > + * > + * The above copyright notice and this permission notice (including > the next > + * paragraph) shall be included in all copies or substantial > portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO > EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES > OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > OTHER > + * DEALINGS IN THE SOFTWARE. > + */ > + > +/** > + * \file ir_array_refcount.cpp > + * > + * Provides a visitor which produces a list of variables referenced. > + */ > + > +#include "ir.h" > +#include "ir_visitor.h" > +#include "ir_array_refcount.h" > +#include "compiler/glsl_types.h" > +#include "util/hash_table.h" > + > +ir_array_refcount_visitor::ir_array_refcount_visitor() > +{ > + this->mem_ctx = ralloc_context(NULL); > + this->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer, > + _mesa_key_pointer_equal); > +} > + > +static void > +free_entry(struct hash_entry *entry) > +{ > + ir_array_refcount_entry *ivre = (ir_array_refcount_entry *) > entry->data; > + delete ivre; > +} > + > +ir_array_refcount_visitor::~ir_array_refcount_visitor() > +{ > + ralloc_free(this->mem_ctx); > + _mesa_hash_table_destroy(this->ht, free_entry); > +} > + > +ir_array_refcount_entry::ir_array_refcount_entry(ir_variable *var) > + : var(var), is_referenced(false) > +{ > + /* empty */ > +} > + > + > +ir_array_refcount_entry * > +ir_array_refcount_visitor::get_variable_entry(ir_variable *var) > +{ > + assert(var); > + > + struct hash_entry *e = _mesa_hash_table_search(this->ht, var); > + if (e) > + return (ir_array_refcount_entry *)e->data; > + > + ir_array_refcount_entry *entry = new > ir_array_refcount_entry(var); > + _mesa_hash_table_insert(this->ht, var, entry); > + > + return entry; > +} > + > + > +ir_visitor_status > +ir_array_refcount_visitor::visit(ir_dereference_variable *ir) > +{ > + ir_variable *const var = ir->variable_referenced(); > + ir_array_refcount_entry *entry = this->get_variable_entry(var); > + > + if (entry)
I don't think this can ever be not true. maybe just assert(entry). If new fails it will throw an exception rather than return null as far as I understand. Otherwise seems fine: Reviewed-by: Timothy Arceri <timothy.arc...@collabora.com> > + entry->is_referenced = true; > + > + return visit_continue; > +} > + > + > +ir_visitor_status > +ir_array_refcount_visitor::visit_enter(ir_function_signature *ir) > +{ > + /* We don't want to descend into the function parameters and > + * dead-code eliminate them, so just accept the body here. > + */ > + visit_list_elements(this, &ir->body); > + return visit_continue_with_parent; > +} > diff --git a/src/compiler/glsl/ir_array_refcount.h > b/src/compiler/glsl/ir_array_refcount.h > new file mode 100644 > index 0000000..9ec46d2 > --- /dev/null > +++ b/src/compiler/glsl/ir_array_refcount.h > @@ -0,0 +1,65 @@ > +/* > + * Copyright © 2016 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person > obtaining a > + * copy of this software and associated documentation files (the > "Software"), > + * to deal in the Software without restriction, including without > limitation > + * the rights to use, copy, modify, merge, publish, distribute, > sublicense, > + * and/or sell copies of the Software, and to permit persons to whom > the > + * Software is furnished to do so, subject to the following > conditions: > + * > + * The above copyright notice and this permission notice (including > the next > + * paragraph) shall be included in all copies or substantial > portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO > EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES > OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > OTHER > + * DEALINGS IN THE SOFTWARE. > + */ > + > +/** > + * \file ir_array_refcount.h > + * > + * Provides a visitor which produces a list of variables referenced. > + */ > + > +#include "ir.h" > +#include "ir_visitor.h" > +#include "compiler/glsl_types.h" > + > +class ir_array_refcount_entry > +{ > +public: > + ir_array_refcount_entry(ir_variable *var); > + > + ir_variable *var; /* The key: the variable's pointer. */ > + > + /** Has the variable been referenced? */ > + bool is_referenced; > +}; > + > +class ir_array_refcount_visitor : public ir_hierarchical_visitor { > +public: > + ir_array_refcount_visitor(void); > + ~ir_array_refcount_visitor(void); > + > + virtual ir_visitor_status visit(ir_dereference_variable *); > + > + virtual ir_visitor_status visit_enter(ir_function_signature *); > + > + /** > + * Find variable in the hash table, and insert it if not present > + */ > + ir_array_refcount_entry *get_variable_entry(ir_variable *var); > + > + /** > + * Hash table mapping ir_variable to ir_array_refcount_entry. > + */ > + struct hash_table *ht; > + > + void *mem_ctx; > +}; > diff --git a/src/compiler/glsl/link_uniforms.cpp > b/src/compiler/glsl/link_uniforms.cpp > index dd6336e..2f851ce 100644 > --- a/src/compiler/glsl/link_uniforms.cpp > +++ b/src/compiler/glsl/link_uniforms.cpp > @@ -28,7 +28,7 @@ > #include "glsl_symbol_table.h" > #include "program.h" > #include "util/string_to_uint_map.h" > -#include "ir_variable_refcount.h" > +#include "ir_array_refcount.h" > > /** > * \file link_uniforms.cpp > @@ -868,11 +868,11 @@ public: > }; > > static bool > -variable_is_referenced(ir_variable_refcount_visitor &v, ir_variable > *var) > +variable_is_referenced(ir_array_refcount_visitor &v, ir_variable > *var) > { > - ir_variable_refcount_entry *const entry = > v.get_variable_entry(var); > + ir_array_refcount_entry *const entry = v.get_variable_entry(var); > > - return entry->referenced_count > 0; > + return entry->is_referenced; > > } > > @@ -886,7 +886,7 @@ static void > link_update_uniform_buffer_variables(struct gl_linked_shader > *shader, > unsigned stage) > { > - ir_variable_refcount_visitor v; > + ir_array_refcount_visitor v; > > v.run(shader->ir); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev