[Mesa-dev] [PATCH 3/3] intel/compiler: add an optimization pass for booleans

Iago Toral itoral at igalia.com
Wed Jul 4 07:51:40 UTC 2018


On Tue, 2018-07-03 at 18:45 -0700, Caio Marcelo de Oliveira Filho
wrote:
> Hi,
> 
> 
> > +   /* Look for any follow-up instructions that sources from the
> > boolean
> > +    * result of the producer instruction and rewrite them to use
> > the correct
> > +    * bit-size.
> > +    */
> > +   foreach_inst_in_block_starting_from(fs_inst, fixup_inst, inst)
> > {
> > +      if (!inst_supports_boolean(fixup_inst))
> > +         continue;
> > +
> > +      /* For MOV instructions we can always rewrite the boolean
> > source
> > +       * if the instrucion reads the same region we produced in
> > the
> > +       * 32-bit conversion.
> > +       */
> > +      if (fixup_inst->opcode == BRW_OPCODE_MOV &&
> > +          region_match(inst->dst, inst->size_written,
> > +                       fixup_inst->src[0], fixup_inst-
> > >size_read(0))) {
> > +         if (propagate_from_source) {
> > +            fixup_inst->src[0].file = inst->src[0].file;
> > +            fixup_inst->src[0].nr = inst->src[0].nr;
> > +         }
> > +         fixup_inst->src[0] =
> > +            fix_bool_reg_bit_size(fixup_inst->src[0], bit_size);
> > +         progress = true;
> > +         continue;
> > +      }
> 
> It seems the rest of the code assumes that instruction is not MOV, so
> you would need to ensure continue is called regardless the region
> match.

Right, although if the region doesn't match the rest of the code won't
do anything anyway.

> Idea: it seems we could just remove this section above (handling
> MOV),
> and slightly change the section below so that MOV can be dealt with
> it
> too.
> 
> - Drop the section above;
> - Rename progress_logical to local_progress;
> - Add a "fixup_inst->opcode == BRW_OPCODE_MOV" to the

The recursive call executes for logical instructions, not for MOV, so
this should be !=.

>   condition that controls the recursive call;
> - Update comments accordingly.

Sounds like a good idea, thanks for the feedback.

Iago

> 
> > +
> > +      /* For logical instructions we have the same restriction as
> > for MOVs,
> > +       * and we also need to:
> > +       *
> > +       * 1. Propagate the bit-size to the boolean destination of
> > the
> > +       *    instruction.
> > +       * 2. Rewrite any instruction that reads the destination to
> > use
> > +       *    the new bit-size.
> > +       *
> > +       * However, we can only do these if we can rewrite all the
> > operands
> > +       * to use the same bit-size.
> > +       */
> > +      bool progress_logical = false;
> > +      bool same_bit_size = true;
> > +      for (unsigned i = 0; i < fixup_inst->sources; i++) {
> > +         if (region_match(inst->dst, inst->size_written,
> > +                          fixup_inst->src[i], fixup_inst-
> > >size_read(i))) {
> > +            if (propagate_from_source) {
> > +               fixup_inst->src[i].file = inst->src[0].file;
> > +               fixup_inst->src[i].nr = inst->src[0].nr;
> > +            }
> > +            fixup_inst->src[i] =
> > +               fix_bool_reg_bit_size(fixup_inst->src[i],
> > bit_size);
> > +            progress_logical = true;
> > +            progress = true;
> > +         }
> > +
> > +         if (i > 0 &&
> > +             type_sz(fixup_inst->src[i].type) !=
> > +             type_sz(fixup_inst->src[i - 1].type)) {
> > +            same_bit_size = false;
> > +         }
> > +      }
> > +
> > +      /* If we have successfully rewritten a logical instruction
> > operand
> > +       * to use a smaller bit-size boolean and all the operands in
> > the
> > +       * instruction have the same small bit-size, then propagate
> > the
> > +       * new bit-size to the destination boolean and do the same
> > for all
> > +       * follow-up instructions that read from it.
> > +       */
> > +      if (progress_logical && same_bit_size) {
> > +         fixup_inst->dst = retype(fixup_inst->dst, fixup_inst-
> > >src[0].type);
> > +         propagate_bool_bit_size(fixup_inst, false);
> > +      }
> > +   }
> > +
> > +   return progress;
> > +}
> 
> 
> 
> 
> Thanks,
> Caio
> 
> 


More information about the mesa-dev mailing list