| /* { dg-do link } */ |
| /* { dg-options "-O2 -fipa-pta -fdump-ipa-pta2-details -fdump-tree-fre3 -fno-ipa-icf -fno-ipa-modref" } */ |
| |
| static int x, y; |
| |
| static __attribute__((noinline,noclone)) void |
| local (int *p) |
| { |
| *p = 1; |
| } |
| |
| static __attribute__((noinline,noclone)) void |
| local_address_taken (int *p) |
| { |
| *p = 1; |
| } |
| |
| void *anyfn_global; |
| |
| /* Even though not referenced in this TU we should have added constraints |
| for the initializer. */ |
| /* { dg-final { scan-ipa-dump "ex = &local_address_taken" "pta2" } } */ |
| void (*ex)(int *) = local_address_taken; |
| |
| extern void link_error (void); |
| |
| int main() |
| { |
| void (*anyfn)(int *) = (void (*)(int *))(__SIZE_TYPE__)anyfn_global; |
| /* The following should cause local_address_taken to get &x |
| as argument, but not local. We shouldn't get &x added to |
| arbitrary special sub-vars of local_address_taken though, |
| a missed optimization currently. |
| As local_address_taken escapes the translation unit its |
| argument points-to set needs to include ESCAPED and NONLOCAL. |
| We shouldn't get the functions sub-vars in the ESCAPED solution |
| though, another missed-optimization. This also causes the functions |
| uses to be messed up even further. */ |
| /* ??? As we don't expand the ESCAPED solution we either get x printed here |
| or not based on the phase of the moon. */ |
| /* { dg-final { scan-ipa-dump "local_address_taken.arg0 = { ESCAPED NONLOCAL y x }" "pta2" { xfail *-*-* } } } */ |
| /* { dg-final { scan-ipa-dump "local_address_taken.clobber = { ESCAPED NONLOCAL y x }" "pta2" { xfail *-*-* } } } */ |
| /* { dg-final { scan-ipa-dump "local_address_taken.use = { }" "pta2" { xfail *-*-* } } } */ |
| /* ??? But make sure x really escaped. */ |
| /* { dg-final { scan-ipa-dump "ESCAPED = {\[^\n\}\]* x \[^\n\}\]*}" "pta2" } } */ |
| (*anyfn) (&x); |
| x = 0; |
| local (&y); |
| /* Thus we should be able to disambiguate x against the call to local |
| and CSE the stored value. */ |
| if (x != 0) |
| link_error (); |
| x = 1; |
| local_address_taken (&y); |
| /* As we are computing flow- and context-insensitive we may not |
| CSE the load of x here. */ |
| /* { dg-final { scan-tree-dump " = x;" "fre3" } } */ |
| return x; |
| } |
| |