OSDN Git Service

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