[Mesa-dev] [PATCH 1/3] intel/peephole_ffma: Fix swizzle propagation

Ian Romanick idr at freedesktop.org
Thu Oct 18 19:46:23 UTC 2018


I was looking at this code just yesterday.  How fortuitous. :)  This
patch is

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

On 10/17/2018 11:33 AM, Jason Ekstrand wrote:
> The num_components value passed into get_mul_for_src is used to only
> compose the parts of the swizzle that we know will be used so we don't
> compose invalid swizzle components.  However, we had a bug where we
> passed the number of components of the add all the way through.  For the
> given source, we need the number of components read from that source.
> In the case where we have a narrow add, say 2 components, that is
> sourced from a chain of wider instructions, we may not compose all the
> swizzles.  All we really need to do is pass through the right number of
> components at each level.
> 
> Fixes: 2231cf0ba3a "nir: Fix output swizzle in get_mul_for_src"
> ---
>  src/intel/compiler/brw_nir_opt_peephole_ffma.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/src/intel/compiler/brw_nir_opt_peephole_ffma.c b/src/intel/compiler/brw_nir_opt_peephole_ffma.c
> index cc225e1847b..7271bdbca43 100644
> --- a/src/intel/compiler/brw_nir_opt_peephole_ffma.c
> +++ b/src/intel/compiler/brw_nir_opt_peephole_ffma.c
> @@ -68,7 +68,7 @@ are_all_uses_fadd(nir_ssa_def *def)
>  }
>  
>  static nir_alu_instr *
> -get_mul_for_src(nir_alu_src *src, int num_components,
> +get_mul_for_src(nir_alu_src *src, unsigned num_components,
>                  uint8_t swizzle[4], bool *negate, bool *abs)
>  {
>     uint8_t swizzle_tmp[4];
> @@ -93,16 +93,19 @@ get_mul_for_src(nir_alu_src *src, int num_components,
>     switch (alu->op) {
>     case nir_op_imov:
>     case nir_op_fmov:
> -      alu = get_mul_for_src(&alu->src[0], num_components, swizzle, negate, abs);
> +      alu = get_mul_for_src(&alu->src[0], alu->dest.dest.ssa.num_components,
> +                            swizzle, negate, abs);
>        break;
>  
>     case nir_op_fneg:
> -      alu = get_mul_for_src(&alu->src[0], num_components, swizzle, negate, abs);
> +      alu = get_mul_for_src(&alu->src[0], alu->dest.dest.ssa.num_components,
> +                            swizzle, negate, abs);
>        *negate = !*negate;
>        break;
>  
>     case nir_op_fabs:
> -      alu = get_mul_for_src(&alu->src[0], num_components, swizzle, negate, abs);
> +      alu = get_mul_for_src(&alu->src[0], alu->dest.dest.ssa.num_components,
> +                            swizzle, negate, abs);
>        *negate = false;
>        *abs = true;
>        break;
> 



More information about the mesa-dev mailing list