! { dg-do run } ! { dg-additional-options "-msse2" { target sse2_runtime } } ! { dg-additional-options "-mavx" { target avx_runtime } } module SIMD3_mod contains subroutine work( a, b, n, sum ) implicit none integer :: i, n double precision :: a(n), b(n), sum, tmp sum = 0.0d0 call init(a, b, n) !$omp simd private(tmp) reduction(+:sum) do i = 1,n tmp = a(i) + b(i) sum = sum + tmp end do end subroutine work subroutine work_ref( a, b, n, sum ) implicit none integer :: i, n double precision :: a(n), b(n), sum, tmp sum = 0.0d0 call init(a, b, n) do i = 1,n tmp = a(i) + b(i) sum = sum + tmp end do end subroutine work_ref subroutine init (a, b, n) double precision :: a(*), b(*) integer :: n, i, s s = -1 do i = 1, n a(i) = i * i * s b(i) = i + i s = -s end do end subroutine end module program SIMD3 use SIMD3_mod double precision :: a(128), b(128), sum, sum_ref, diff double precision, parameter :: EPS = 0.0000000000000001 call work(a, b, 128, sum) call work_ref(a, b, 128, sum_ref) diff = sum - sum_ref if (diff > EPS .or. -diff > EPS) stop 1 end program