On Sep 23, 2015 02:19, "Eduardo Lima Mitev" <el...@igalia.com> wrote: > > On 09/23/2015 07:18 AM, Jason Ekstrand wrote: > > > > On Sep 22, 2015 10:01 PM, "Jason Ekstrand" <ja...@jlekstrand.net > > <mailto:ja...@jlekstrand.net>> wrote: > >> > >> It's possible that, if a vecN operation is involved in a phi node, that we > >> could end up moving from a register to itself. If swizzling is involved, > >> we need to emit the move but. However, if there is no swizzling, then the > >> mov is a no-op and we might as well not bother emitting it. > >> > >> Shader-db results on Haswell: > >> > >> total instructions in shared programs: 6262536 -> 6259558 (-0.05%) > >> instructions in affected programs: 184780 -> 181802 (-1.61%) > >> helped: 838 > >> HURT: 0 > > > > By the way, I have absolutely no idea why this helps more than Matt's > > patch to delete these in register coalesce. > > > > Also in HSW, and with current master, I get this: > > total instructions in shared programs: 6260467 -> 6259804 (-0.01%) > instructions in affected programs: 84738 -> 84075 (-0.78%) > helped: 375 > HURT: 0 > > Something must have overlapped improvements in the mean, likely > Alejandro's register coalescing modifiers patch.
No, Matt landed his patch to delete useless MOVs. This patch just stops us from generating them in the first place. > The two patches are: > > Reviewed-by: Eduardo Lima Mitev <el...@igalia.com> Thanks! --Jason > >> --- > >> src/glsl/nir/nir_lower_vec_to_movs.c | 19 ++++++++++++++++++- > >> 1 file changed, 18 insertions(+), 1 deletion(-) > >> > >> diff --git a/src/glsl/nir/nir_lower_vec_to_movs.c > > b/src/glsl/nir/nir_lower_vec_to_movs.c > >> index 287f2bf..2039891 100644 > >> --- a/src/glsl/nir/nir_lower_vec_to_movs.c > >> +++ b/src/glsl/nir/nir_lower_vec_to_movs.c > >> @@ -83,7 +83,24 @@ insert_mov(nir_alu_instr *vec, unsigned start_idx, > > nir_shader *shader) > >> } > >> } > >> > >> - nir_instr_insert_before(&vec->instr, &mov->instr); > >> + /* In some situations (if the vecN is involved in a phi-web), we > > can end > >> + * up with a mov from a register to itself. Some of those > > channels may end > >> + * up doing nothing and there's no reason to have them as part of > > the mov. > >> + */ > >> + if (src_matches_dest_reg(&mov->dest.dest, &mov->src[0].src) && > >> + !mov->src[0].abs && !mov->src[0].negate) { > >> + for (unsigned i = 0; i < 4; i++) { > >> + if (mov->src[0].swizzle[i] == i) > >> + mov->dest.write_mask &= ~(1 << i); > >> + } > >> + } > >> + > >> + /* Only emit the instruction if it actually does something */ > >> + if (mov->dest.write_mask) { > >> + nir_instr_insert_before(&vec->instr, &mov->instr); > >> + } else { > >> + ralloc_free(mov); > >> + } > >> > >> return mov->dest.write_mask; > >> } > >> -- > >> 2.5.0.400.gff86faf > >> > > > > > > > > _______________________________________________ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev