| /* 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; |
| } |