[Mesa-dev] [PATCH 8/8] i965: Remove redundant discard jumps.

Kenneth Graunke kenneth at whitecape.org
Tue Feb 24 11:33:44 PST 2015


On Tuesday, February 24, 2015 12:20:08 PM Eric Anholt wrote:
> Kenneth Graunke <kenneth at whitecape.org> writes:
> 
> > With the previous optimization in place, some shaders wind up with
> > multiple discard jumps in a row, or jumps directly to the next
> > instruction.  We can remove those.
> >
> > Without NIR on Haswell:
> > total instructions in shared programs: 5777258 -> 5775872 (-0.02%)
> > instructions in affected programs:     20312 -> 18926 (-6.82%)
> > helped:                                716
> >
> > With NIR on Haswell:
> > total instructions in shared programs: 5773163 -> 5771785 (-0.02%)
> > instructions in affected programs:     21040 -> 19662 (-6.55%)
> > helped:                                717
> >
> > v2: Use the CFG rather than the old instructions list.  Presumably
> >     the placeholder halt will be in the last basic block.
> >
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> >  src/mesa/drivers/dri/i965/brw_fs.cpp | 42 ++++++++++++++++++++++++++++++++++++
> >  src/mesa/drivers/dri/i965/brw_fs.h   |  1 +
> >  2 files changed, 43 insertions(+)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > index 9df1650..21e1e82 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> > @@ -2558,6 +2558,47 @@ fs_visitor::opt_register_renaming()
> >     return progress;
> >  }
> >  
> > +/**
> > + * Remove redundant or useless discard jumps.
> > + *
> > + * For example, we can eliminate jumps in the following sequence:
> > + *
> > + * discard-jump       (redundant with the next jump)
> > + * discard-jump       (useless; jumps to the next instruction)
> > + * placeholder-halt
> > + */
> > +bool
> > +fs_visitor::opt_redundant_discard_jumps()
> > +{
> > +   bool progress = false;
> > +
> > +   bblock_t *last_bblock = cfg->blocks[cfg->num_blocks - 1];
> > +
> > +   fs_inst *placeholder_halt = NULL;
> > +   foreach_inst_in_block_reverse(fs_inst, inst, last_bblock) {
> > +      if (inst->opcode == FS_OPCODE_PLACEHOLDER_HALT) {
> > +         placeholder_halt = inst;
> > +         break;
> > +      }
> > +   }
> > +
> > +   if (!placeholder_halt)
> > +      return false;
> > +
> > +   /* Delete any HALTs immediately before the placeholder halt. */
> > +   for (fs_inst *prev = (fs_inst *) placeholder_halt->prev;
> > +        prev->opcode == FS_OPCODE_DISCARD_JUMP;
> > +        prev = (fs_inst *) placeholder_halt->prev) {
> > +      prev->remove(last_bblock);
> > +      progress = true;
> > +   }
> 
> My only question in this series was "what if the placeholder halt is the
> first instruction in the block?"  Shouldn't you be checking for a start
> sentinel?

Yep.  It's certainly not common.  But void main() {} hits that case.

I've changed the loop condition to:
!prev->is_head_sentinel() && prev->opcode == FS_OPCODE_DISCARD_JUMP;

> Other than that, this series is:
> 
> Reviewed-by: Eric Anholt <eric at anholt.net>
> 
> and I look forward to using the NIR intrinsic in my TGSI support.

Thanks!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150224/7336529c/attachment.sig>


More information about the mesa-dev mailing list