! { dg-do run } ! { dg-additional-options "-msse2" { target sse2_runtime } } ! { dg-additional-options "-mavx" { target avx_runtime } } module work integer :: P(1000) real :: A(1000) contains function do_work(arr) result(pri) implicit none real, dimension(*) :: arr real :: pri integer :: i, j !$omp simd private(j) lastprivate(pri) do i = 1, 999 j = P(i) pri = 0.5 if (mod(j-1, 2) == 0) then pri = A(j+1) + arr(i) endif A(j) = pri * 1.5 pri = pri + A(j) end do end function do_work end module work program simd_8f use work implicit none real :: pri, arr(1000), diff integer :: i real, parameter :: EPS = 0.005 do i = 1, 1000 P(i) = i A(i) = (i-1) * 1.5 arr(i) = (i-1) * 1.8 end do pri = do_work(arr) diff = pri - 8237.25 if (diff > EPS .or. -diff > EPS) call abort end program