| /* { dg-do compile } */ |
| /* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-cp-details --param=ipa-cp-eval-threshold=2" } */ |
| |
| struct S |
| { |
| int a, b, c; |
| }; |
| |
| int __attribute__((noinline)) foo (int i, struct S s); |
| int __attribute__((noinline)) bar (int i, struct S s); |
| int __attribute__((noinline)) baz (int i, struct S s); |
| |
| |
| int __attribute__((noinline)) |
| bar (int i, struct S s) |
| { |
| return baz (i, s); |
| } |
| |
| int __attribute__((noinline)) |
| baz (int i, struct S s) |
| { |
| return foo (i, s); |
| } |
| |
| int __attribute__((noinline)) |
| foo (int i, struct S s) |
| { |
| if (i == 2) |
| return 0; |
| else |
| return s.b * s.b + bar (i - 1, s); |
| } |
| |
| volatile int g; |
| |
| void entry (void) |
| { |
| struct S s; |
| s.b = 4; |
| g = bar (g, s); |
| } |
| |
| |
| void entry2 (void) |
| { |
| struct S s; |
| s.b = 6; |
| g = baz (g, s); |
| } |
| |
| |
| /* { dg-final { scan-ipa-dump-times "adding an extra caller" 2 "cp" { xfail { hppa*-*-hpux* && { ! lp64 } } } } } */ |