[Mesa-dev] [PATCH 05/23] i965/fs: fix copy-propagation with suboffset from constants

Jordan Justen jordan.l.justen at intel.com
Tue May 3 23:21:36 UTC 2016


On 2016-05-03 05:21:54, Samuel Iglesias Gonsálvez wrote:
> From: Iago Toral Quiroga <itoral at igalia.com>
> 
> The current code ignores the suboffet in the instruction's source
> and just uses the one from the constant. This is not correct
> when the instruction's source is accessing the constant with a
> different type and using the suboffset to select a specific
> chunk of the constant. We generate this kind of code in fp64
> when we want to select only the high 32-bit of a particular
> double constant.
> 
> Instead, we should add any existing suboffset in the
> instruction's source (modulo the size of the entry's type)
> to the suboffset in the constant so we can preserve the orinal
> semantics.
> 
> Prevents that we turn this:
> 
> mov(8) vgrf5:DF, u2<0>:DF
> mov(8) vgrf7:UD, vgrf5+0.4<2>:UD
> 
> Into:
> 
> mov(8) vgrf7:UD, u2<0>:UD
> 
> And instead, with this patch, we produce:
> 
> mov(8) vgrf7:UD, u2+0.4<0>:UD
> ---
>  .../drivers/dri/i965/brw_fs_copy_propagation.cpp   | 23 ++++++++++++++++++++--
>  1 file changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> index aa4c9c9..5fae10f 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> @@ -445,8 +445,27 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
>     case BAD_FILE:
>     case ARF:
>     case FIXED_GRF:
> -      inst->src[arg].reg_offset = entry->src.reg_offset;
> -      inst->src[arg].subreg_offset = entry->src.subreg_offset;
> +      {
> +         inst->src[arg].reg_offset = entry->src.reg_offset;
> +         inst->src[arg].subreg_offset = entry->src.subreg_offset;
> +
> +         /* If we copy propagate from a larger type we have to be aware that
> +          * the instruction might be using subreg_offset to select a particular
> +          * chunk of the data in the entry. For example:
> +          *
> +          * mov(8) vgrf5:DF, u2<0>:DF
> +          * mov(8) vgrf7:UD, vgrf5+0.4<2>:UD
> +          *
> +          * vgrf5+0.4<2>:UD is actually reading the high 32-bit of u2.0, so if
> +          * we want to copy propagate here we have to do it from u2+0.4.
> +          */
> +         int type_sz_src = type_sz(inst->src[arg].type);
> +         int type_sz_entry = type_sz(entry->src.type);
> +         if (type_sz_entry > type_sz_src) {
> +            inst->src[arg].subreg_offset +=
> +               inst->src[arg].subreg_offset % type_sz_entry;

Seeing 'inst->src[arg].subreg_offset' on both sides of this += seems
strange. Is this correct?

-Jordan

> +         }
> +      }
>        break;
>     case ATTR:
>     case VGRF:
> -- 
> 2.5.0
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list