[Mesa-dev] [PATCH 08/23] i965/fs: Add support for specifying register horizontal strides.

Paul Berry stereotype441 at gmail.com
Mon Dec 30 09:06:25 PST 2013


On 19 December 2013 14:52, Francisco Jerez <currojerez at riseup.net> wrote:

> Paul Berry <stereotype441 at gmail.com> writes:
>
> >[...]
> > In v2 of this patch, you add the following code to
> > fs_visitor::try_copy_propagate():
> >
> > +   /* Bail if the result of composing both strides cannot be expressed
> > +    * as another stride.
> > +    */
> > +   if (entry->src.stride != 1 &&
> > +       (inst->src[arg].stride *
> > +        type_sz(inst->src[arg].type)) % type_sz(entry->src.type) != 0)
> >        return false;
> >
> > I don't understand.  It seems like this is trying to make sure that
> > (src_stride * src_type_sz) / entry_type_sz is an integer so we can later
> > use the factor (src_type_sz / entry_type_sz) as a multiplicative factor
> to
> > correct the stride without creating a fractional result.  But I don't see
> > us applying this correction factor anywhere.  Is there some code missing?
>
> That isn't exactly the purpose of that check.
>
> The problem arises when you are trying to compose two regions of
> different base types.  If the stride in bytes of 'inst->src[arg]' is not
> a multiple of the element size of 'entry->src' you end up with an
> inhomogeneous stride that can only be expressed as a two-dimensional
> region.  Instead of adding support for two-dimensional regions (which
> would be hard, not very useful, and only a partial solution because then
> we would need to handle composition of two-dimensional regions that
> yield three- and four-dimensional regions as a result) I disallowed
> copy-propagation in that case.
>
> Thanks.
>

Ok, I see.  I had to spend quite a while fiddling with scratch paper to
understand this.  Would you mind adding an example to the comment to
clarify this?  Perhaps something like this:

   /* Bail if the result of composing both strides cannot be expressed as
    * another stride.  This avoids, for example, trying to transform this:
    *
    *     MOV (8) rX<1>UD rY<0;1,0>UD
    *     FOO (8) ...     rX<8;8,2>UW
    *
    * into this:
    *
    *     FOO (8) ...     rY<8;8,0>UW
    *
    * Which would have different semantics.
    */

Note: the code sequence in my example is bogus because it crosses data
between SIMD execution paths, so it would never actually arise in
practice.  I wasn't able to come up with a realistic example; in fact,
after trying and failing to come up with a non-bogus example, I'm pretty
convinced that this particular bailout case will never happen unless
there's a bug elsewhere in the compiler.  You might want to consider adding
an assert(false) into the code path so that if it ever does occur we'll
have a chance to investigate.

I don't have strong feelings about adding the assert, though.  With the
comment updated (and the other comment suggestion from my previous email
about is_power_of_two()), this patch is:

Reviwed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131230/256a46ae/attachment-0001.html>


More information about the mesa-dev mailing list