| /* { dg-do run } */ |
| /* { dg-options "-O1 -foptimize-sibling-calls -fdump-tree-optimized" } */ |
| |
| extern void abort (void); |
| extern void exit (int); |
| |
| int foo (int n) |
| { |
| return n == 0 ? 1 : n * (n - foo (n - 1)); |
| } |
| |
| int bar (int n) |
| { |
| return n == 0 ? 1 : n * (- bar (n - 1)); |
| } |
| |
| int baz (int n, int m) |
| { |
| return n == 0 ? 100 : (baz (n - 1, m) - m); |
| } |
| |
| int main (void) |
| { |
| if (foo (6) != 726) |
| abort (); |
| |
| if (bar (7) != -5040) |
| abort (); |
| |
| if (baz (10, 5) != 50) |
| abort (); |
| |
| exit (0); |
| } |
| |
| /* { dg-final { scan-tree-dump-times "\\mfoo\\M" 4 "optimized"} } */ |
| /* { dg-final { scan-tree-dump-times "\\mbar\\M" 4 "optimized"} } */ |
| /* { dg-final { scan-tree-dump-times "\\mbaz\\M" 4 "optimized"} } */ |
| |