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. The two patches are: Reviewed-by: Eduardo Lima Mitev <el...@igalia.com> >> --- >> 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