On 09/16/2016 01:12 AM, 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. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/compiler/glsl/standalone.cpp | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp index c4b6854..f7e1055 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,64 @@ 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; + + for (entry = _mesa_set_next_entry(variables, NULL); + entry != NULL; + entry = _mesa_set_next_entry(variables, entry)) {
please use set_foreach() macro here, with that fixed; Reviewed-by: Tapani Pälli <tapani.pa...@intel.com>
+ 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 @@ -471,6 +530,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