1 /* { dg-do run } */
2 /* { dg-options "-O2 -funroll-loops --param max-unroll-times=8 -fpredictive-commoning -fdump-tree-pcom-details -fno-tree-pre" } */
3 
4 void abort (void);
5 
6 long int fib[1000];
7 
8 __attribute__ ((noinline))
count_fib(void)9 void count_fib(void)
10 {
11   int i;
12 
13   fib[0] = 0;
14   fib[1] = 1;
15   for (i = 2; i < 1000; i++)
16     fib[i] = (fib[i-1] + fib[i - 2]) & 0xffff;
17 }
18 
19 int avg[1000];
20 
21 __attribute__ ((noinline))
count_averages(void)22 void count_averages(void)
23 {
24   int i;
25 
26   for (i = 1; i < 999; i++)
27     avg[i] = ((fib[i - 1] + fib[i] + fib[i + 1]) / 3) & 0xffff;
28 }
29 
main(void)30 int main(void)
31 {
32   count_fib ();
33   count_averages ();
34 
35   if (fib[19] != 4181 || avg[19] != 4510)
36     abort ();
37 
38   if (fib[999] != 162 || avg[998] != 21953)
39     abort ();
40 
41   return 0;
42 }
43 
44 /* Verify that both loops were transformed and unrolled.  */
45 /* { dg-final { scan-tree-dump-times "Unrolling 2 times." 2 "pcom"} } */
46