[Mesa-dev] [PATCH 08/16] i965/fs: Add a pass to fixup 3-src instructions that have a null dest.

Kenneth Graunke kenneth at whitecape.org
Tue Jan 20 00:18:53 PST 2015


On Monday, January 19, 2015 03:31:07 PM Matt Turner wrote:
> 3-src instructions can only have GRF/MRF destinations. It's really
> difficult to deal with that restriction in dead code elimination (that
> wants to give instructions null destinations to show that their result
> isn't used) while allowing 3-src instructions to have conditional mod,
> so don't, and just give then a destination before register allocation.
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp | 14 ++++++++++++++
>  src/mesa/drivers/dri/i965/brw_fs.h   |  1 +
>  2 files changed, 15 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 35639de..73d722e 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -3605,6 +3605,18 @@ fs_visitor::optimize()
>  }
>  

Doxygen comments above functions are nice:

/**
 * Three source instruction must have a GRF/MRF destination register.
 * ARF NULL is not allowed.  Fix that up by allocating a temporary GRF.
 */

With that added, this gets
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

(I think you could drop the comment in the function, but either way's fine)

>  void
> +fs_visitor::fixup_3src_null_dest()
> +{
> +   foreach_block_and_inst_safe (block, fs_inst, inst, cfg) {
> +      if (inst->is_3src() && inst->dst.is_null()) {
> +         /* 3-src instructions can only have GRF/MRF destination. */
> +         inst->dst = fs_reg(GRF, virtual_grf_alloc(dispatch_width / 8),
> +                            inst->dst.type);
> +      }
> +   }
> +}
> +
> +void
>  fs_visitor::allocate_registers()
>  {
>     bool allocated_without_spills;
> @@ -3701,6 +3713,7 @@ fs_visitor::run_vs()
>     assign_curb_setup();
>     assign_vs_urb_setup();
>  
> +   fixup_3src_null_dest();
>     allocate_registers();
>  
>     return !failed;
> @@ -3780,6 +3793,7 @@ fs_visitor::run_fs()
>        assign_curb_setup();
>        assign_urb_setup();
>  
> +      fixup_3src_null_dest();
>        allocate_registers();
>  
>        if (failed)
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
> index 2aa58eb..9c125a6 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -423,6 +423,7 @@ public:
>     void setup_payload_gen4();
>     void setup_payload_gen6();
>     void setup_vs_payload();
> +   void fixup_3src_null_dest();
>     void assign_curb_setup();
>     void calculate_urb_setup();
>     void assign_urb_setup();
> 
-------------- 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/20150120/e7f684bd/attachment.sig>


More information about the mesa-dev mailing list