| /* { dg-do run } */ |
| /* { dg-options "-fdump-tree-alias" } */ |
| /* { dg-skip-if "" { *-*-* } { "-O0" "-fno-fat-lto-objects" } { "" } } */ |
| |
| extern void abort (void); |
| int *g; |
| int dummy; |
| |
| int * __attribute__((noinline,const,noipa)) |
| foo_const(int *p) { return p; } |
| |
| int * __attribute__((noinline,pure,noipa)) |
| foo_pure(int *p) { return p + dummy; } |
| |
| int * __attribute__((noinline,noipa)) |
| foo_normal(int *p) { g = p; return p; } |
| |
| void test_const(void) |
| { |
| int i; |
| int *p = &i; |
| int *q_const = foo_const(p); |
| *p = 1; |
| *q_const = 2; |
| if (*p != 2) |
| abort (); |
| } |
| |
| void test(void) |
| { |
| int i; |
| int *p = &i; |
| int *q_normal = foo_normal(p); |
| *p = 1; |
| *q_normal = 2; |
| if (*p != 2) |
| abort (); |
| } |
| |
| void test_pure(void) |
| { |
| int i; |
| int *p = &i; |
| int *q_pure = foo_pure(p); |
| *p = 1; |
| *q_pure = 2; |
| if (*p != 2) |
| abort (); |
| } |
| |
| int main() |
| { |
| test_const(); |
| test(); |
| test_pure(); |
| return 0; |
| } |
| |
| /* { dg-final { scan-tree-dump "q_const_. = { NONLOCAL i }" "alias" } } */ |
| /* { dg-final { scan-tree-dump "q_pure_. = { ESCAPED NONLOCAL i }" "alias" } } */ |
| /* { dg-final { scan-tree-dump "q_normal_. = { ESCAPED NONLOCAL i }" "alias" } } */ |