1! { dg-do run { target vect_simd_clones } }
2! { dg-additional-options "-msse2" { target sse2_runtime } }
3! { dg-additional-options "-mavx" { target avx_runtime } }
4
5program fibonacci
6   implicit none
7   integer,parameter :: N=30
8   integer           :: a(0:N-1), b(0:N-1)
9   integer           :: a_ref(0:N-1)
10   integer           :: i
11   integer, external :: fib
12
13   !$omp simd
14   do i = 0,N-1
15      b(i) = i
16   end do
17
18   !$omp simd
19   do i=0,N-1
20      a(i) = fib(b(i))
21   end do
22
23   call fib_ref (a_ref, N)
24
25   do i = 0, N-1
26     if (a(i) .ne. a_ref(i)) stop 1
27   end do
28
29end program
30
31recursive function fib(n) result(r)
32!$omp declare simd(fib) inbranch
33   integer  :: n, r
34
35   if (n <= 1) then
36       r = n
37   else
38      r = fib(n-1) + fib(n-2)
39   endif
40
41end function fib
42
43subroutine fib_ref(a_ref, n)
44   integer  :: n, a_ref(0:n-1)
45
46   a_ref(0) = 0
47   a_ref(1) = 1
48
49   do i = 2, n-1
50     a_ref(i) = a_ref(i-1) + a_ref(i-2)
51   end do
52
53end subroutine fib_ref
54