blob: d074d4de5a01667040cac566b90f66435d396f22 [file] [log] [blame]
! { dg-do run }
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }
! PR fortran/107424
! Nonrectangular loop nests checks
module m
implicit none (type, external)
contains
! The 'k' loop uses i or j as start value
! but a constant end value such that 'lastprivate'
! should be well-defined
subroutine lastprivate_check_simd_1
integer :: n,m,p, i,j,k
n = 11
m = 23
p = 27
! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops
! Then same, except use non-unit step for 'k'
!$omp simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp simd collapse(3) lastprivate(k)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp simd collapse(3) lastprivate(k)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) then
! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p)"
error stop
end if
end do
end do
end do
if (k /= p + 1) error stop
k = -43
m = 0
!$omp simd collapse(3) lastprivate(k)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) then
! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p)"
error stop
end if
end do
end do
end do
if (k /= -43) error stop
m = 23
!$omp simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
n = -5
k = - 70
!$omp simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= -70) error stop
n = 11
! Same but 'private' for all (i,j) vars
!$omp simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
! Same - but with lastprivate(i,j)
!$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 1 .or. j /= m + 2) error stop
!$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 2 .or. j /= m + 1) error stop
!$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 2 .or. j /= m + 1) error stop
!$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 1 .or. j /= m + 2) error stop
end subroutine lastprivate_check_simd_1
! Same but with do simd
subroutine lastprivate_check_do_simd_1
integer :: n,m,p, i,j,k
n = 11
m = 23
p = 27
! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops
! Then same, except use non-unit step for 'k'
!$omp parallel do simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
! Same but 'private' for all (i,j) vars
!$omp parallel do simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k) private(i,j)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
! Same - but with lastprivate(i,j)
!$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 1 .or. j /= m + 2) error stop
!$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 2 .or. j /= m + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 2 .or. j /= m + 1) error stop
!$omp parallel do simd collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 1 .or. j /= m + 2) error stop
end subroutine lastprivate_check_do_simd_1
! Same but with do
subroutine lastprivate_check_do_1
integer :: n,m,p, i,j,k
n = 11
m = 23
p = 27
! Use 'i' or 'j', unit step on 'i' or on 'j' -> 4 loops
! Then same, except use non-unit step for 'k'
!$omp parallel do collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do collapse(3) lastprivate(k)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do collapse(3) lastprivate(k)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
! Same but 'private' for all (i,j) vars
!$omp parallel do collapse(3) lastprivate(k) private(i,j)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do collapse(3) lastprivate(k) private(i,j)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do collapse(3) lastprivate(k) private(i,j)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
!$omp parallel do collapse(3) lastprivate(k) private(i,j)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
! Same - but with lastprivate(i,j)
!$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n
do j = 1, m, 2
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 1 .or. j /= m + 2) error stop
!$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n, 2
do j = 1, m
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 2 .or. j /= m + 1) error stop
!$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n, 2
do j = 1, m
do k = j - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 2 .or. j /= m + 1) error stop
!$omp parallel do collapse(3) lastprivate(k) lastprivate(i,j)
do i = 1, n
do j = 1, m, 2
do k = i - 41, p
if (k < 1 - 41 .or. k > p) error stop
end do
end do
end do
if (k /= p + 1) error stop
if (i /= n + 1 .or. j /= m + 2) error stop
end subroutine lastprivate_check_do_1
subroutine lastprivate_check_2
integer :: n,m,p, i,j,k,ll
n = 11
m = 23
p = 27
!$omp parallel do simd collapse(3) lastprivate(ll)
do i = 1, n
do j = 1, m,2
do k = 1, j + 41
do ll = 1, p, 2
if (k > 23 + 41 .or. k < 1) error stop
end do
end do
end do
end do
if (ll /= 29) error stop
!$omp simd collapse(3) lastprivate(ll)
do i = 1, n
do j = 1, m,2
do k = 1, j + 41
do ll = 1, p, 2
if (k > 23 + 41 .or. k < 1) error stop
end do
end do
end do
end do
if (ll /= 29) error stop
!$omp simd collapse(3) lastprivate(k)
do i = 1, n,2
do j = 1, m
do k = 1, i + 41
if (k > 11 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 53) then
print *, k, 53
error stop
endif
!$omp simd collapse(3) lastprivate(k)
do i = 1, n,2
do j = 1, m
do k = 1, j + 41
if (k > 23 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 65) then
print *, k, 65
error stop
endif
!$omp simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m,2
do k = 1, i + 41
if (k > 11 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 53) then
print *, k, 53
error stop
endif
! - Same but without 'private':
!$omp simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m,2
do k = 1, j + 41
if (k > 23 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 65) then
print *, k, 65
error stop
endif
!$omp simd collapse(3) lastprivate(k)
do i = 1, n,2
do j = 1, m
do k = 1, i + 41
if (k > 11 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 53) then
print *, k, 53
error stop
endif
!$omp simd collapse(3) lastprivate(k)
do i = 1, n,2
do j = 1, m
do k = 1, j + 41
if (k > 23 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 65) then
print *, k, 65
error stop
endif
!$omp simd collapse(3) lastprivate(k)
do i = 1, n
do j = 1, m,2
do k = 1, i + 41
if (k > 11 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 53) then
print *, k, 53
error stop
endif
! - all with lastprivate
!$omp simd collapse(3) lastprivate(k) lastprivate(i, j)
do i = 1, n
do j = 1, m,2
do k = 1, j + 41
if (k > 23 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 65) then
print *, k, 65
error stop
endif
!$omp simd collapse(3) lastprivate(k) lastprivate(i, j)
do i = 1, n,2
do j = 1, m
do k = 1, i + 41
if (k > 11 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 53) then
print *, k, 53
error stop
endif
!$omp simd collapse(3) lastprivate(k) lastprivate(i, j)
do i = 1, n,2
do j = 1, m
do k = 1, j + 41
if (k > 23 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 65) then
print *, k, 65
error stop
endif
!$omp simd collapse(3) lastprivate(k) lastprivate(i, j)
do i = 1, n
do j = 1, m,2
do k = 1, i + 41
if (k > 11 + 41 .or. k < 1) error stop
end do
end do
end do
if (k /= 53) then
print *, k, 53
error stop
endif
end
end module m
program main
use m
implicit none (type, external)
call lastprivate_check_simd_1
call lastprivate_check_do_simd_1
call lastprivate_check_do_1
call lastprivate_check_2
end