blob: dfd003b7682ec23bd691d2090d7d0cb92a83cc48 [file] [log] [blame]
! { dg-do run }
! { dg-options "-O2" }
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }
integer, save :: u(1024), v(1024), w(1024), m
integer :: i
v = (/ (i, i = 1, 1024) /)
w = (/ (i + 1, i = 1, 1024) /)
!$omp parallel
!$omp single
call f1 (1, 1024)
!$omp end single
!$omp end parallel
do i = 1, 1024
if (u(i) .ne. 2 * i + 1) call abort
v(i) = 1024 - i
w(i) = 512 - i
end do
!$omp parallel
!$omp single
call f2 (2, 1022, 17)
!$omp end single
!$omp end parallel
do i = 1, 1024
if (i .lt. 2 .or. i .gt. 1022) then
if (u(i) .ne. 2 * i + 1) call abort
else
if (u(i) .ne. 1536 - 2 * i) call abort
end if
v(i) = i
w(i) = i + 1
end do
if (m .ne. (1023 + 2 * (1021 * 5 + 17) + 9)) call abort
!$omp parallel
!$omp single
call f3 (1, 1024)
!$omp end single
!$omp end parallel
do i = 1, 1024
if (u(i) .ne. 2 * i + 1) call abort
v(i) = 1024 - i
w(i) = 512 - i
end do
if (m .ne. 1025) call abort
!$omp parallel
!$omp single
call f4 (0, 31, 1, 32)
!$omp end single
!$omp end parallel
do i = 1, 1024
if (u(i) .ne. 1536 - 2 * i) call abort
v(i) = i
w(i) = i + 1
end do
if (m .ne. 32 + 33 + 1024) call abort
!$omp parallel
!$omp single
call f5 (0, 31, 1, 32)
!$omp end single
!$omp end parallel
do i = 1, 1024
if (u(i) .ne. 2 * i + 1) call abort
end do
if (m .ne. 32 + 33) call abort
contains
subroutine f1 (a, b)
integer, intent(in) :: a, b
integer :: d
!$omp taskloop simd default(none) shared(u, v, w) nogroup
do d = a, b
u(d) = v(d) + w(d)
end do
! d is predetermined linear, so we can't let the tasks continue past
! end of this function.
!$omp taskwait
end subroutine f1
subroutine f2 (a, b, cx)
integer, intent(in) :: a, b, cx
integer :: c, d, e
c = cx
!$omp taskloop simd default(none) shared(u, v, w) linear(d:1) linear(c:5) lastprivate(e)
do d = a, b
u(d) = v(d) + w(d)
c = c + 5
e = c + 9
end do
!$omp end taskloop simd
m = d + c + e
end subroutine f2
subroutine f3 (a, b)
integer, intent(in) :: a, b
integer, target :: d
integer, pointer :: p
!$omp taskloop simd default(none) shared(u, v, w) private (p)
do d = a, b
p => d
u(d) = v(d) + w(d)
p => null()
end do
m = d
end subroutine f3
subroutine f4 (a, b, c, d)
integer, intent(in) :: a, b, c, d
integer, target :: e, f
integer, pointer :: p, q
integer :: g, r
!$omp taskloop simd default(none) shared(u, v, w) lastprivate(g) collapse(2) private (r, p, q)
do e = a, b
do f = c, d
p => e
q => f
r = 32 * e + f
u(r) = v(r) + w(r)
g = r
p => null()
q => null()
end do
end do
m = e + f + g
end subroutine f4
subroutine f5 (a, b, c, d)
integer, intent(in) :: a, b, c, d
integer :: e, f, r
!$omp taskloop simd default(none) shared(u, v, w) collapse(2) private (r)
do e = a, b
do f = c, d
r = 32 * e + f
u(r) = v(r) + w(r)
end do
end do
m = e + f
end subroutine f5
end