[Mesa-dev] [PATCH 12/24] glsl: Add predicate to determine if an IR node has side effects.

Paul Berry stereotype441 at gmail.com
Tue Sep 17 14:22:27 PDT 2013


On 15 September 2013 00:10, Francisco Jerez <currojerez at riseup.net> wrote:

> And fix the dead code elimination pass so atomic writes aren't
> optimized out in cases where the return value isn't used by the
> program.
>

As I mentioned in my comments on patch 9, I'd prefer if we went with a
different approach where we don't add ir_rvalue nodes that have side
effects at all, but instead stick with our current system where only
ir_instruction nodes can have side effects.

However, if we do wind up going with this approach, we'll need to make
has_side_effects() recurse through the expression tree, so that it can see
that expressions like (atomicCounterIncrement(c) + 1) and
foo[atomicCounterIncrement(c)] also have side effects.

We would also need to modify several other optimization passes to check for
side effects:

- opt_dead_code_local (which does the same job as opt_dead_code, but within
basic blocks)

- opt_tree_grafting - as is, this would try to transform:

uint x = atomicCounterIncrement(c);
uint y = atomicCounterIncrement(c);
uvec3 v = uvec3(y, x, y);

Into:

uint y = atomicCounterIncrement(c);
uvec3 v = uvec3(y, atomicCounterIncrement(c), y);

Which is not equivalent.

- lower_variable_index_to_cond_assign, lower_vec_index_to_cond_assign, and
lower_vector_insert (which sometimes clone arbitrary rvalues)

And possibly others I've missed.


There's also at least one contrived case which is propably not worth fixing:

- opt_flip_matrices (in principle this might try to rewrite
gl_TextureMatrix[atomicCounterIncrement(c)] *
foo[atomicCounterIncrement(c)] to foo[atomicCounterIncrement(c)] *
gl_TextureMatrixTranspose(c), which is technically not the same operation).


> ---
>  src/glsl/ir.h              | 16 ++++++++++++++++
>  src/glsl/opt_dead_code.cpp |  3 ++-
>  2 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
> index c4b4677..4f506a3 100644
> --- a/src/glsl/ir.h
> +++ b/src/glsl/ir.h
> @@ -139,6 +139,17 @@ public:
>     virtual class ir_jump *              as_jump()             { return
> NULL; }
>     /*@}*/
>
> +   /**
> +    * Determine if an IR instruction has side effects other than its
> +    * returned value(s).  Optimization passes are expected to be
> +    * especially careful with reordering or removing these, unless
> +    * they know what they are doing.
> +    */
> +   virtual bool has_side_effects() const
> +   {
> +      return false;
> +   }
> +
>  protected:
>     ir_instruction()
>     {
> @@ -2120,6 +2131,11 @@ public:
>
>     virtual ir_visitor_status accept(ir_hierarchical_visitor *);
>
> +   virtual bool has_side_effects() const
> +   {
> +      return true;
> +   }
> +
>     /** Kind of atomic instruction. */
>     enum ir_atomic_opcode op;
>
> diff --git a/src/glsl/opt_dead_code.cpp b/src/glsl/opt_dead_code.cpp
> index b65e5c2..fd05034 100644
> --- a/src/glsl/opt_dead_code.cpp
> +++ b/src/glsl/opt_dead_code.cpp
> @@ -81,7 +81,8 @@ do_dead_code(exec_list *instructions, bool
> uniform_locations_assigned)
>           */
>          if (entry->var->mode != ir_var_function_out &&
>              entry->var->mode != ir_var_function_inout &&
> -             entry->var->mode != ir_var_shader_out) {
> +             entry->var->mode != ir_var_shader_out &&
> +             !entry->assign->rhs->has_side_effects()) {
>             entry->assign->remove();
>             progress = true;
>
> --
> 1.8.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130917/a74061b6/attachment.html>


More information about the mesa-dev mailing list