[Mesa-dev] [PATCH 10/15] glsl/standalone: Optimize dead variable declarations
Tapani Pälli
tapani.palli at intel.com
Mon Sep 26 10:39:01 UTC 2016
On 09/16/2016 01:12 AM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at 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.romanick at 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.palli at 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);
> }
>
More information about the mesa-dev
mailing list