[Bug tree-optimization/62171] restrict pointer to struct with restrict pointers parm doesn't prevent aliases
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Tue Sep 22 10:51:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62171
--- Comment #9 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 22 Sep 2015, vries at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62171
>
> --- Comment #8 from vries at gcc dot gnu.org ---
> (In reply to Richard Biener from comment #7)
> > I was thinking about sth like
> >
> > struct X { int i; int * __restrict__ q; };
> >
> > int foo (X& __restrict__ x, X *p)
> > {
> > *x.q = 1;
> > p->i = 0;
> > return *x.q;
> > }
> >
> > int main()
> > {
> > X x;
> > x.q = &x.i;
> > return foo (x, &x);
> > }
> >
>
> I think this example's an invalid use of restrict.
>
> By using restrict in the 'X& __restrict__ x' parameter of foo, we promise that
> if the object x points to is modified during foo execution (and it is, by both
> assignments) we only access the object using pointers based on x during foo
> execution.
>
> p is pointing to the same object, and we access the object via p. But p is not
> based on x.
Sorry, I modified it bogously, just move int i; out of the struct and
somewhere else. My concerns boil down to X being passed twice,
once as reference and once as pointer. The PTA machinery will
then use restrict for X.q for the reference case but not for
the pointer case. I believe C doesn't specify what happens for
these "indirect" cases (nor for what happens for global restricts).
To behave "correctly" PTA would need to correlate q from both
parameters.
More information about the Gcc-bugs
mailing list