! { dg-do run { target vect_simd_clones } } ! { dg-additional-options "-msse2" { target sse2_runtime } } ! { dg-additional-options "-mavx" { target avx_runtime } } module SIMD6_mod contains function foo(p) result(r) !$omp declare simd(foo) notinbranch integer :: p, r p = p + 10 r = p end function foo function myaddint(a, b, n) result(r) implicit none integer :: a(*), b(*), n, r integer :: i !$omp simd do i=1, n a(i) = foo(b(i)) ! foo is not called under a condition end do r = a(n) end function myaddint function myaddint_ref(a, b, n) result(r) implicit none integer :: a(*), b(*), n, r integer :: i do i=1, n a(i) = foo(b(i)) end do r = a(n) end function myaddint_ref function goo(p) result(r) !$omp declare simd(goo) inbranch real :: p, r p = p + 18.5 r = p end function goo function myaddfloat(x, y, n) result(r) implicit none real :: x(*), y(*), r integer :: n integer :: i !$omp simd do i=1, n if (x(i) > y(i)) then x(i) = goo(y(i)) ! goo is called under the condition (or within a branch) else x(i) = y(i) endif end do r = x(n) end function myaddfloat function myaddfloat_ref(x, y, n) result(r) implicit none real :: x(*), y(*), r integer :: n integer :: i do i=1, n if (x(i) > y(i)) then x(i) = goo(y(i)) else x(i) = y(i) endif end do r = x(n) end function myaddfloat_ref subroutine init (b, y, n) integer :: b(128) real :: y(128) s = -1 do i = 1, n b(i) = i*i*s y(i) = i*i*s s = -s end do end subroutine subroutine init2 (b, y, n) integer :: b(128) real :: y(128) do i = 1, n b(i) = i y(i) = i end do end subroutine subroutine checkfloat (a, b, n) integer :: i, n real, parameter :: EPS = 0.000001 real :: diff, a(*), b(*) do i = 1, n diff = a(i) - b(i) if (diff > EPS .or. -diff > EPS) stop 1 end do end subroutine subroutine checkint (a, b, n) integer :: i, n, a(*), b(*) do i = 1, n if (a(i) .ne. b(i)) stop 2 end do end subroutine subroutine test () integer :: a(128), a_ref(128), b(128), ri, ri_ref real :: x(128), x_ref(128), y(128), rf, rf_ref call init2(a, x, 128) call init2(a_ref, x_ref, 128) call init(b, y, 128) ri = myaddint (a, b, 128) rf = myaddfloat (x, y, 128) call init(b, y, 128) ri_ref = myaddint_ref (a_ref, b, 128) rf_ref = myaddfloat_ref (x_ref, y, 128) call checkint (a, a_ref, 128) call checkfloat (x, x_ref, 128) end subroutine end module program SIMD6 use SIMD6_mod, only: test call test () end program