On Mon, Sep 21, 2015 at 2:16 PM, Kenneth Graunke <kenn...@whitecape.org> wrote: > On Monday, September 21, 2015 02:04:00 PM Matt Turner wrote: >> With NIR: >> >> instructions in affected programs: 111508 -> 109193 (-2.08%) >> helped: 507 >> >> Without NIR: >> >> instructions in affected programs: 28763 -> 28474 (-1.00%) >> helped: 186 >> --- >> src/mesa/drivers/dri/i965/brw_vec4.cpp | 21 +++++++++++++++++++++ >> 1 file changed, 21 insertions(+) >> >> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp >> b/src/mesa/drivers/dri/i965/brw_vec4.cpp >> index ed49cd3..d09a8dd 100644 >> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp >> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp >> @@ -1021,6 +1021,27 @@ vec4_visitor::opt_register_coalesce() >> inst->src[0].abs || inst->src[0].negate || inst->src[0].reladdr) >> continue; >> >> + if (inst->dst.file == inst->src[0].file && >> + inst->dst.reg == inst->src[0].reg && >> + inst->dst.reg_offset == inst->src[0].reg_offset) { >> + bool is_nop_mov = true; >> + >> + for (unsigned c = 0; c < 4; c++) { >> + if ((inst->dst.writemask & (1 << c)) == 0) >> + continue; >> + >> + if (BRW_GET_SWZ(inst->src[0].swizzle, c) != c) { >> + is_nop_mov = false; >> + break; >> + } >> + } >> + >> + if (is_nop_mov) { >> + inst->remove(block); >> + continue; >> + } >> + } >> + >> bool to_mrf = (inst->dst.file == MRF); >> >> /* Can't coalesce this GRF if someone else was going to >> > > Seems like this would break for: > > mov(8) g2<1>F g2.xyzw<4,4,1>D > > or > > mov(8) g2<1>F -|g2.xyzw|<4,4,1>F > > Did I miss something?
Yeah, the block immediately above handles conditions like this: if (inst->opcode != BRW_OPCODE_MOV || (inst->dst.file != GRF && inst->dst.file != MRF) || inst->predicate || inst->src[0].file != GRF || inst->dst.type != inst->src[0].type || inst->src[0].abs || inst->src[0].negate || inst->src[0].reladdr) continue; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev