[Mesa-dev] [PATCH] i965/vec4: Detect and delete useless MOVs.

Matt Turner mattst88 at gmail.com
Mon Sep 21 14:27:00 PDT 2015


On Mon, Sep 21, 2015 at 2:16 PM, Kenneth Graunke <kenneth at 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;


More information about the mesa-dev mailing list