On Tue, Jun 9, 2020 at 12:19 PM Eric Botcazou <botca...@adacore.com> wrote:
>
> > I'm probably completely misunderstanding how TYPE_REVERSE_STORAGE_ORDER
> > works and what the constraints are.  But if the memcpy is the storage order
> > barrier then what cases are OK?
> >
> >  - both source and destination objects are [only] accessed with the same
> >    storage order
> >  - both source and destination objects are [only] accessed with
> >    !TYPE_REVERSE_STORAGE_ORDER "containing" accesses
> >
> > and what determines the "object state" with respect to storage order
> > when we see a memcpy call?  I had the impression (from the other
> > existing cases of contains_storage_order_barrier_p () calls) that
> > we derive the "object state" from the downstream access (vr->operands),
> > in this case the memcpy destination access.  But see below for maybe
> > the easier case (memcpy folding).
>
> All cases are OK if you don't try to replace memcpy with something else.  The
> only possible replacement would be with a VIEW_CONVERT_EXPR, but I guess that
> it would be quickly folded into a MEM_EXPR and then we're back to square one.
>
> > In my understanding of how TYPE_REVERSE_STORAGE_ORDER works
> > a memcpy, irrespective of its actual "implementation" should not break
> > anything since it transfers bytes.
>
> The point of the discussion is precisely to make it work in all cases.
>
> > In particular a 8 byte TYPE_REVERSE_STORAGE_ORDER
> > object can be transfered ("memcpy"ed) with (ignoring TBAA)
> >
> >   int tema = *(int *)src;
> >   *(int *)dst = tema;
> >   int temb = *((int *)src + 1);
> >   *((int *)dst + 1) = temb;
> >
> > and what byteorder the int accesses are performed in is irrelevant
> > as long as read and write use the same byteorder.
>
> No, because of the fundamental invariant of the implementation: you may _not_
> access the same memory location with different storage orders, this is simply
> not supported and we document the limitation in the manual.  The program does
> not do that, so it's valid; the program after folding does that, which means
> that the folding is invalid.
>
> > > Yes, theoritically, but SRA rewrites the access into a scalar access and
> > > we're back to square one (I tried).
> >
> > But what's the issue with this?
>
> Same as above: access to the same location with different storage orders.
>
> > Why?  Is the following an invalid program?
> >
> > void mymemcpy (void *a, void *b) { memcpy (a, b, 8); }
> > void foo()
> > {
> >   int b[2] __attribute__(reverse_storage);
> >   int a[2];
> >   mymemcpy (a, b);
> >   return a[0];
> > }
> >
> > how can GCC infer, inside mymemcpy that b is reverse storage order?
>
> No, that's supported, again the point of the discussion is precisely to make
> it work!

But GCC does not see the reverse storage order in mymemcpy so
it happily folds the memcpy inside it, inlines the result and then?

> > Thus, if all this is a problem then I think we're papering over the issue
> > by not folding memcpy.
>
> I don't really see why you're insisting on folding memcpy.  It's semantically
> equivalent to VIEW_CONVERT_EXPR so it needs to be treated the same way.

I'm not insisting on folding memcpy.  I'm questioning you are fixing
the actual bug ;)

Richard.

> --
> Eric Botcazou

Reply via email to