[Mesa-dev] [PATCH 14/41] SQUASH: i965/fs: Make sources and destinations interfere in 16-wide

Matt Turner mattst88 at gmail.com
Tue Sep 23 10:42:03 PDT 2014


On Sat, Sep 20, 2014 at 10:23 AM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> ---
>  src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp | 24 +++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
> index f3f6ef4..f0b118f 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
> @@ -472,6 +472,30 @@ fs_visitor::assign_regs(bool allow_spilling)
>     if (brw->gen >= 7)
>        setup_mrf_hack_interference(g, first_mrf_hack_node);
>
> +   if (dispatch_width > 8) {
> +      /* In 16-wide dispatch we have an issue where a compressed
> +       * instruction is actually two instructions executed simultaneiously.

simultaneously

> +       * It's actually ok to have the source and destination registers be
> +       * the same.  In this case, each instruction over-writes its own
> +       * source and there's no problem.  The real problem here is if the
> +       * source and destination registers are off by one.  Then you can end
> +       * up in a scenario where the first instruction over-writes the
> +       * source of the second instruction.  Since the compiler doesn't know
> +       * about this level of granularity, we simply make the source and
> +       * destination interfere.
> +       */
> +      foreach_in_list(fs_inst, inst, &instructions) {

Pending review of a pair of patches, my cfg series is going to remove
the ability to do a foreach_in_list of the instructions. You'll have
to change this to

    foreach_block_and_inst(block, fs_inst, inst, cfg)


More information about the mesa-dev mailing list