1/* { dg-do run } */
2/* { dg-options "-O1 -foptimize-sibling-calls -fdump-tree-optimized" } */
3
4extern void abort (void);
5extern void exit (int);
6
7int sum (int n)
8{
9  if (n == 0)
10    return 0;
11
12  return n + sum (n - 1);
13}
14
15int fac (int n)
16{
17  if (n == 0)
18    return 1;
19
20  return n * fac (n - 1);
21}
22
23int sq_sum (int n)
24{
25  if (n == 0)
26    return 0;
27
28  return n * n + sq_sum (n - 1);
29}
30
31int pow2m1 (int n)
32{
33  if (n == 0)
34    return 0;
35
36  return 2 * pow2m1 (n - 1) + 1;
37}
38
39int fib (int n)
40{
41  if (n <= 1)
42    return 1;
43
44  return fib (n - 2) + fib (n - 1);
45}
46
47int main(void)
48{
49  if (sum (5) != 15)
50    abort ();
51
52  if (fac (5) != 120)
53    abort ();
54
55  if (sq_sum (5) != 55)
56    abort ();
57
58  if (pow2m1 (5) != 31)
59    abort ();
60
61  if (fib (5) != 8)
62    abort ();
63
64  exit (0);
65}
66
67/* There is one call of sum in main and then 2 instances of the word in
68   ;; Function sum (sum) and one in the function header.  */
69/* { dg-final { scan-tree-dump-times "\\msum\\M" 4 "optimized"} } */
70/* { dg-final { scan-tree-dump-times "\\mfac\\M" 4 "optimized"} } */
71/* { dg-final { scan-tree-dump-times "\\msq_sum\\M" 4 "optimized"} } */
72/* { dg-final { scan-tree-dump-times "\\mpow2m1\\M" 4 "optimized"} } */
73
74/* There is one recursive call to fib.  */
75/* { dg-final { scan-tree-dump-times "\\mfib\\M" 5 "optimized"} } */
76
77/* { dg-final { cleanup-tree-dump "optimized" } } */
78