| /* { dg-do run } */ |
| /* { dg-options "-fdump-tree-ealias -Wno-attributes" } */ |
| /* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ |
| |
| struct X |
| { |
| long l1; |
| struct Y |
| { |
| long l2; |
| int *p; |
| } y; |
| }; |
| int i; |
| static int __attribute__((always_inline)) |
| foo (struct X *x) |
| { |
| struct Y y = x->y; |
| /* In the inlined instance the dereferenced pointer needs to point to i. */ |
| *y.p = 0; |
| i = 1; |
| return *y.p; |
| } |
| extern void abort (void); |
| int main() |
| { |
| struct X x; |
| x.y.p = &i; |
| if (foo(&x) != 1) |
| abort (); |
| return 0; |
| } |
| |
| /* { dg-final { scan-tree-dump "y.* = { i }" "ealias" } } */ |
| /* { dg-final { scan-tree-dump "y.*, points-to vars: { D..... }" "ealias" } } */ |