1 /* PR 15262.
2    The alias analyzer only considers relations between pointers and
3    symbols.  If two pointers P and Q point to the same symbol S, then
4    their respective memory tags will either be the same or they will
5    have S in their alias set.
6 
7    However, if there are no common symbols between P and Q, TBAA will
8    currently miss their alias relationship altogether.  */
9 struct A
10 {
11   int t;
12   int i;
13 };
14 
foo()15 int foo () { return 3; }
16 
main()17 main ()
18 {
19   struct A loc, *locp;
20   float f, g, *p;
21   int T355, *T356;
22 
23   /* Avoid the partial hack in TBAA that would consider memory tags if
24      the program had no addressable symbols.  */
25   f = 3;
26   g = 2;
27   p = foo () ? &g : &f;
28   if (*p > 0.0)
29     g = 1;
30 
31   /* Store into *locp and cache its current value.  */
32   locp = malloc (sizeof (*locp));
33   locp->i = 10;
34   T355 = locp->i;
35 
36   /* Take the address of one of locp's fields and write to it.  */
37   T356 = &locp->i;
38   *T356 = 1;
39 
40   /* Read the recently stored value.  If TBAA fails, this will appear
41      as a redundant load that will be replaced with '10'.  */
42   T355 = locp->i;
43   if (T355 != 1)
44     abort ();
45 
46   return 0;
47 }
48