I was looking at this code just yesterday. How fortuitous. :) This patch is
Reviewed-by: Ian Romanick <ian.d.roman...@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; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev