[Mesa-dev] [PATCH 09/23] i965/fs: don't copy propagate from a larger type if the stride is not 1
Francisco Jerez
currojerez at riseup.net
Wed May 11 00:28:12 UTC 2016
Samuel Iglesias Gonsálvez <siglesias at igalia.com> writes:
> From: Iago Toral Quiroga <itoral at igalia.com>
>
> Because the stride is in units for the type, if we copy-propagate from
> a another instruction using a larger type, then we need to make sure
> that the source in that instruction, the one we will be copy-propagating
> from, sources consecutive elements, otherwise, when sourced using a
> a smaller type, the actual elements read would change.
>
> Prevents that we turn this:
> mov(8) vgrf3+2.0:DF, vgrf11<0>:DF
> load_payload(8) vgrf15:UD, ..., vgrf3+2.0<0>:D, vgrf3+3.0<0>:D
>
> Into:
> mov(8) vgrf3+2.0:DF, vgrf11<0>:DF
> load_payload(8) vgrf15:UD, ..., vgrf11<0>:D, vgrf11<0>:D
>
Sorry but I don't see the problem, the two assembly examples look fully
equivalent to me.
> In the original instructions, vgrf3+2.0<0>:D reads a replicated 64-bit
> value, while the result after copy propagation only reads the first
> 32-bit of the value.
> ---
> src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> 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 9fc06cb..f98ab41 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
> @@ -400,6 +400,15 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
> if (type_sz(entry->dst.type) < type_sz(inst->src[arg].type))
> return false;
>
> + /* Bail if the instruction type is larger than the execution type of the
> + * copy and the stride of the source we would be copy propagating from
> + * has a stride other than 1. Otherwise, since the stride is in units of
> + * the type, we would be changing the region effectively sourced.
> + */
> + if (type_sz(entry->dst.type) > type_sz(inst->src[arg].type) &&
> + entry->src.stride != 1)
> + return false;
NAK, there is a more accurate condition just a few lines below making
sure that the strides can be composed correctly when the original
entry->src.stride is not one. Some special cases of
'type_sz(entry->dst.type) > type_sz(inst->src[arg].type) &&
entry->src.stride != 1' are handled by copy propagation, and the cases
that are not should already be caught by the check immediately below.
> +
> /* Bail if the result of composing both strides cannot be expressed
> * as another stride. This avoids, for example, trying to transform
> * this:
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160510/a8a60d63/attachment.sig>
More information about the mesa-dev
mailing list