Reviewed-by: Iago Toral Quiroga <ito...@igalia.com>
On Tue, 2016-10-25 at 17:59 -0700, Ian Romanick wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > We didn't bother with this in the regular compiler because it doesn't > change the generated code. In the stand-alone compiler, this can > clutter the output with useless variables. It's especially bad after > functions are inlined but the foo_retval declarations remain. > > v2: Use set_foreach. Suggested by Tapani. > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > Reviewed-by: Tapani Pälli <tapani.pa...@intel.com> > --- > src/compiler/glsl/standalone.cpp | 61 > ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 61 insertions(+) > > diff --git a/src/compiler/glsl/standalone.cpp > b/src/compiler/glsl/standalone.cpp > index b41d25c..6a4432f 100644 > --- a/src/compiler/glsl/standalone.cpp > +++ b/src/compiler/glsl/standalone.cpp > @@ -37,6 +37,7 @@ > #include "standalone_scaffolding.h" > #include "standalone.h" > #include "util/string_to_uint_map.h" > +#include "util/set.h" > > class add_neg_to_sub_visitor : public ir_hierarchical_visitor { > public: > @@ -69,6 +70,62 @@ public: > } > }; > > +class dead_variable_visitor : public ir_hierarchical_visitor { > +public: > + dead_variable_visitor() > + { > + variables = _mesa_set_create(NULL, > + _mesa_hash_pointer, > + _mesa_key_pointer_equal); > + } > + > + virtual ~dead_variable_visitor() > + { > + _mesa_set_destroy(variables, NULL); > + } > + > + virtual ir_visitor_status visit(ir_variable *ir) > + { > + /* If the variable is auto or temp, add it to the set of > variables that > + * are candidates for removal. > + */ > + if (ir->data.mode != ir_var_auto && ir->data.mode != > ir_var_temporary) > + return visit_continue; > + > + _mesa_set_add(variables, ir); > + > + return visit_continue; > + } > + > + virtual ir_visitor_status visit(ir_dereference_variable *ir) > + { > + struct set_entry *entry = _mesa_set_search(variables, ir- > >var); > + > + /* If a variable is dereferenced at all, remove it from the > set of > + * variables that are candidates for removal. > + */ > + if (entry != NULL) > + _mesa_set_remove(variables, entry); > + > + return visit_continue; > + } > + > + void remove_dead_variables() > + { > + struct set_entry *entry; > + > + set_foreach(variables, entry) { > + ir_variable *ir = (ir_variable *) entry->key; > + > + assert(ir->ir_type == ir_type_variable); > + ir->remove(); > + } > + } > + > +private: > + set *variables; > +}; > + > static const struct standalone_options *options; > > static void > @@ -475,6 +532,10 @@ standalone_compile_shader(const struct > standalone_options *_options, > add_neg_to_sub_visitor v; > visit_list_elements(&v, shader->ir); > > + dead_variable_visitor dv; > + visit_list_elements(&dv, shader->ir); > + dv.remove_dead_variables(); > + > shader->Program = rzalloc(shader, gl_program); > init_gl_program(shader->Program, shader->Stage); > } _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev