mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-06-11 22:29:28 +00:00
48 lines
1.1 KiB
C
48 lines
1.1 KiB
C
/* 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;
|
|
}
|