[Mesa-dev] [PATCH] nir/builder: Don't emit no-op swizzles

Ian Romanick idr at freedesktop.org
Sat Feb 23 00:13:52 UTC 2019


Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

On 2/22/19 4:03 PM, Jason Ekstrand wrote:
> The nir_swizzle helper is used some on it's own but it's also called by
> nir_channel and nir_channels which are used everywhere.  It's pretty
> quick to check while we're walking the swizzle anyway whether or not
> it's an identity swizzle.  If it is, we now don't bother emitting the
> instruction.  Sure, copy-prop will clean it up for us but there's no
> sense making more work for the optimizer than we have to.
> ---
>  src/compiler/nir/nir_builder.h | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h
> index c6e80e729a8..253ca5941cb 100644
> --- a/src/compiler/nir/nir_builder.h
> +++ b/src/compiler/nir/nir_builder.h
> @@ -497,8 +497,16 @@ nir_swizzle(nir_builder *build, nir_ssa_def *src, const unsigned *swiz,
>     assert(num_components <= NIR_MAX_VEC_COMPONENTS);
>     nir_alu_src alu_src = { NIR_SRC_INIT };
>     alu_src.src = nir_src_for_ssa(src);
> -   for (unsigned i = 0; i < num_components && i < NIR_MAX_VEC_COMPONENTS; i++)
> +
> +   bool is_identity_swizzle = true;
> +   for (unsigned i = 0; i < num_components && i < NIR_MAX_VEC_COMPONENTS; i++) {
> +      if (swiz[i] != i)
> +         is_identity_swizzle = false;
>        alu_src.swizzle[i] = swiz[i];
> +   }
> +
> +   if (num_components == src->num_components && is_identity_swizzle)
> +      return src;
>  
>     return use_fmov ? nir_fmov_alu(build, alu_src, num_components) :
>                       nir_imov_alu(build, alu_src, num_components);
> 



More information about the mesa-dev mailing list