[Mesa-dev] [PATCH] nir/deref: Drop zero ptr_as_array derefs

Lionel Landwerlin lionel.g.landwerlin at intel.com
Sun Feb 3 18:58:32 UTC 2019


On 03/02/2019 16:04, Jason Ekstrand wrote:
> They are effectively (&x)[0] or *&x which does nothing.


Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>


> ---
>   src/compiler/nir/nir_deref.c | 21 +++++++++++++++++++++
>   1 file changed, 21 insertions(+)
>
> diff --git a/src/compiler/nir/nir_deref.c b/src/compiler/nir/nir_deref.c
> index 2f5fda643ca..13aa10c7532 100644
> --- a/src/compiler/nir/nir_deref.c
> +++ b/src/compiler/nir/nir_deref.c
> @@ -670,6 +670,27 @@ opt_deref_ptr_as_array(nir_builder *b, nir_deref_instr *deref)
>      assert(deref->deref_type == nir_deref_type_ptr_as_array);
>   
>      nir_deref_instr *parent = nir_deref_instr_parent(deref);
> +
> +   if (nir_src_is_const(deref->arr.index) &&
> +       nir_src_as_int(deref->arr.index) == 0) {
> +      /* If it's a ptr_as_array deref with an index of 0, it does nothing
> +       * and we can just replace its uses with its parent.
> +       *
> +       * The source of a ptr_as_array deref always has a deref_type of
> +       * nir_deref_type_array or nir_deref_type_cast.  If it's a cast, it
> +       * may be trivial and we may be able to get rid of that too.  Any
> +       * trivial cast of trivial cast cases should be handled already by
> +       * opt_deref_cast() above.
> +       */
> +      if (parent->deref_type == nir_deref_type_cast &&
> +          is_trivial_deref_cast(parent))
> +         parent = nir_deref_instr_parent(parent);
> +      nir_ssa_def_rewrite_uses(&deref->dest.ssa,
> +                               nir_src_for_ssa(&parent->dest.ssa));
> +      nir_instr_remove(&deref->instr);
> +      return true;
> +   }
> +
>      if (parent->deref_type != nir_deref_type_array &&
>          parent->deref_type != nir_deref_type_ptr_as_array)
>         return false;




More information about the mesa-dev mailing list