http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49330
--- Comment #10 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-06-10
11:13:53 UTC ---
(In reply to comment #9)
> > Creating that pointer is perfectly valid - you are allowed to cast a
> > pointer to an uintptr_t and back, which is what the code does (in some
> > obfuscated way of course).
>
> No disagreement, "problematic" only in the sense that it breaks the assumption
> of the aliasing machinery, as you're creating a pointer out of nothing.
Indeed. I fixed similar bugs in tree points-to analysis, like
int x, y;
int foo (int *p)
{
int *q = &x;
int *p = &y;
int i;
for (i=0; i<sizeof(int *); ++i)
((char *)&q)[i] = ((char *)&p)[i];
*p = 1;
*q = 2;
return *p;
}
which I suspect might work on RTL only by accident (at -O3 with the
loop unrolled).