On Thu, Apr 25, 2019 at 3:03 PM Peter Sewell <peter.sew...@cl.cam.ac.uk> wrote:
>
> On 25/04/2019, Richard Biener <richard.guent...@gmail.com> wrote:
> > On Wed, Apr 24, 2019 at 11:18 PM Peter Sewell <peter.sew...@cl.cam.ac.uk>
> > wrote:
> >>
> >> On 24/04/2019, Jeff Law <l...@redhat.com> wrote:
> >> > On 4/24/19 4:19 AM, Richard Biener wrote:
> >> >> On Thu, Apr 18, 2019 at 3:42 PM Jeff Law <l...@redhat.com> wrote:
> >> >>>
> >> >>> On 4/18/19 6:20 AM, Uecker, Martin wrote:
> >> >>>> Am Donnerstag, den 18.04.2019, 11:45 +0100 schrieb Peter Sewell:
> >> >>>>> On Thu, 18 Apr 2019 at 10:32, Richard Biener
> >> >>>>> <richard.guent...@gmail.com> wrote:
> >> >>>>
> >> >>>>
> >> >>>>> An equality test of two pointers, on the other hand, doesn't
> >> >>>>> necessarily
> >> >>>>> mean that they are interchangeable.  I don't see any good way to
> >> >>>>> avoid that in a provenance semantics, where a one-past
> >> >>>>> pointer might sometimes compare equal to a pointer to an
> >> >>>>> adjacent object but be illegal for accessing it.
> >> >>>>
> >> >>>> As I see it, there are essentially four options:
> >> >>>>
> >> >>>> 1.) Compilers do not use conditional equivalences for
> >> >>>> optimizations of pointers (or only when additional
> >> >>>> conditions apply which make it safe)
> >> >>> I know this will hit DOM and CSE.  I wouldn't be surprised if it
> >> >>> touches
> >> >>> VRP as well, maybe PTA.  It seems simple enough though :-)
> >> >>
> >> >> Also touches fundamental PHI-OPT transforms like
> >> >>
> >> >>  if (a == b)
> >> >> ...
> >> >>
> >> >>  # c = PHI <a, b>
> >> >>
> >> >> where we'd lose eliding such a conditional.  IMHO that's bad
> >> >> and very undesirable.
> >> > But if we only suppress this optimization for pointers is it that
> >> > terrible?
> >>
> >> As far as I can see right now, there isn't a serious alternative.
> >> Suppose x and y are adjacent, p=&x+1, and q=&y, so p==q might
> >> be true (either in a semantics for the source-language == that just
> >> compares the concrete representations or in one that's allowed
> >> but not required to be provenance-sensitive).   It's not possible
> >> to simultaneously have *p UB (which AIUI the compiler has to
> >> have in the intermediate language, to make alias analysis sound),
> >> *q not UB, and p interchangeable with q.    Am I missing something?
> >
> > No, you are not missing anything.  We do have this issue right now,
> > independent of standard wordings.  But the standard has that, too,
> > not allowing *(&x + 1), allowing the compare and allowing *&y.
> > Isn't that a defect as well?
>
> In the source-language semantics, it's ok for p==q to not imply
> that p and q are interchangeable, and if compilers are doing
> provenance-based alias analysis (so address equality doesn't
> imply equally-readable/writable), it's pretty much inescapable.
>
> Hence why (without knowing much about the optimisations that
> actually go on) it's tempting to suggest that for pointer equality
> comparison one could just not infer that interchangeability. I'd be
> very interested to know the actual cost of that.

Since we at the moment track provenance through non-pointers
it means we cannot do this for non-pointer equivalences either.
So doing this means no longer tracking provenance through
non-pointers.

> (The standard does also have a defect in its definition of equality - on
> the one hand, it says that &x+1==&y comparison must be true
> if they are adjacent, but on the other (in DR260) that everything
> might be provenance-aware.   My preference would be to resolve
> that by requiring source-language == to not be provenance aware,
> but I think this is a more-or-less independent thing.)

I think it's related at least to us using provenance to optimize
pointer comparisons.

Richard.

> Peter

Reply via email to