[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