[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