|  | ! { dg-do run { target vect_simd_clones } } | 
|  | ! { dg-additional-options "-msse2" { target sse2_runtime } } | 
|  | ! { dg-additional-options "-mavx" { target avx_runtime } } | 
|  |  | 
|  | program fibonacci | 
|  | implicit none | 
|  | integer,parameter :: N=30 | 
|  | integer           :: a(0:N-1), b(0:N-1) | 
|  | integer           :: a_ref(0:N-1) | 
|  | integer           :: i | 
|  | integer, external :: fib | 
|  |  | 
|  | !$omp simd | 
|  | do i = 0,N-1 | 
|  | b(i) = i | 
|  | end do | 
|  |  | 
|  | !$omp simd | 
|  | do i=0,N-1 | 
|  | a(i) = fib(b(i)) | 
|  | end do | 
|  |  | 
|  | call fib_ref (a_ref, N) | 
|  |  | 
|  | do i = 0, N-1 | 
|  | if (a(i) .ne. a_ref(i)) stop 1 | 
|  | end do | 
|  |  | 
|  | end program | 
|  |  | 
|  | recursive function fib(n) result(r) | 
|  | !$omp declare simd(fib) inbranch | 
|  | integer  :: n, r | 
|  |  | 
|  | if (n <= 1) then | 
|  | r = n | 
|  | else | 
|  | r = fib(n-1) + fib(n-2) | 
|  | endif | 
|  |  | 
|  | end function fib | 
|  |  | 
|  | subroutine fib_ref(a_ref, n) | 
|  | integer  :: n, a_ref(0:n-1) | 
|  |  | 
|  | a_ref(0) = 0 | 
|  | a_ref(1) = 1 | 
|  |  | 
|  | do i = 2, n-1 | 
|  | a_ref(i) = a_ref(i-1) + a_ref(i-2) | 
|  | end do | 
|  |  | 
|  | end subroutine fib_ref |