Kenneth Graunke <kenn...@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 <kenn...@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?

Other than that, this series is:

Reviewed-by: Eric Anholt <e...@anholt.net>

and I look forward to using the NIR intrinsic in my TGSI support.

Attachment: signature.asc
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to