blob: f6a6fe40b73b8181eee778151e348dc0ab8ecb66 [file] [log] [blame]
/* PR 15262.
The alias analyzer only considers relations between pointers and
symbols. If two pointers P and Q point to the same symbol S, then
their respective memory tags will either be the same or they will
have S in their alias set.
However, if there are no common symbols between P and Q, TBAA will
currently miss their alias relationship altogether. */
struct A
{
int t;
int i;
};
int foo () { return 3; }
main ()
{
struct A loc, *locp;
float f, g, *p;
int T355, *T356;
/* Avoid the partial hack in TBAA that would consider memory tags if
the program had no addressable symbols. */
f = 3;
g = 2;
p = foo () ? &g : &f;
if (*p > 0.0)
g = 1;
/* Store into *locp and cache its current value. */
locp = malloc (sizeof (*locp));
locp->i = 10;
T355 = locp->i;
/* Take the address of one of locp's fields and write to it. */
T356 = &locp->i;
*T356 = 1;
/* Read the recently stored value. If TBAA fails, this will appear
as a redundant load that will be replaced with '10'. */
T355 = locp->i;
if (T355 != 1)
abort ();
return 0;
}