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