if (!simple)
{
- /* FIXME: Handle non-unit iter steps, cf. PR fortran/107424. */
+ /* FIXME: Handle non-const iter steps, cf. PR fortran/110735. */
sorry_at (gfc_get_location (&curr_loop_var->where),
- "non-rectangular loop nest with step other than constant 1 "
- "or -1 for %qs", curr_loop_var->symtree->n.sym->name);
+ "non-rectangular loop nest with non-constant step for %qs",
+ curr_loop_var->symtree->n.sym->name);
return false;
}
}
else
{
- /* FIXME: Handle non-unit iter steps, cf. PR fortran/107424. */
+ /* FIXME: Handle non-const iter steps, cf. PR fortran/110735. */
sorry_at (gfc_get_location (&code->loc),
- "non-rectangular loop nest with step other than constant "
- "1 or -1 for %qs", var->name);
+ "non-rectangular loop nest with non-constant step "
+ "for %qs", var->name);
inform (gfc_get_location (&expr->where), "Used here");
return false;
}
gfc_add_block_to_block (pblock, &se.pre);
step = gfc_evaluate_now (se.expr, pblock);
- if (integer_onep (step))
- simple = 1;
- else if (tree_int_cst_equal (step, integer_minus_one_node))
- simple = -1;
+ if (TREE_CODE (step) == INTEGER_CST)
+ simple = tree_int_cst_sgn (step);
gfc_init_se (&se, NULL);
if (!clauses->non_rectangular
! { dg-final { scan-tree-dump-times "#pragma omp for nowait" 6 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp for linear\\(x:D\\.\[0-9\]+\\) nowait" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp for linear\\(x:val,step\\(D\\.\[0-9\]+\\)\\) nowait" 1 "original" } }
-! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(count\\.\[0-9\]:1\\) linear\\(i:3\\)" 2 "original" } }
-! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(count\\.\[0-9\]:1\\) linear\\(i:val,step\\(3\\)\\)" 2 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:3\\)" 2 "original" } }
+! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:val,step\\(3\\)\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) linear\\(x:D\\.\[0-9\]+\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) linear\\(x:val,step\\(D\\.\[0-9\]+\\)\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:D\\.\[0-9\]+\\)" 2 "original" } }
@item @code{requires} directive @tab P
@tab complete but no non-host device provides @code{unified_shared_memory}
@item @code{teams} construct outside an enclosing target region @tab Y @tab
-@item Non-rectangular loop nests @tab P @tab Full support for C/C++, partial for Fortran
+@item Non-rectangular loop nests @tab P
+ @tab Full support for C/C++, partial for Fortran
+ (@uref{https://gcc.gnu.org/PR110735,PR110735})
@item @code{!=} as relational-op in canonical loop form for C/C++ @tab Y @tab
@item @code{nonmonotonic} as default loop schedule modifier for worksharing-loop
constructs @tab Y @tab
! Nonrectangular loop nests checks
-! See PR or non-rectangular-loop-1a.f90 for the commented tests
-! Hint: Those use step for loop vars part of nonrectangular loop nests
-
module m
implicit none (type, external)
contains
! 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
+ 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)"
+ ! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p)"
error stop
end if
end do
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)"
+ ! print *, i, j, k,p, " -> i, j, k, p (k < 1 - 41 .or. k > p)"
error stop
end if
end do
! 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
+ 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
! 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
+ 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
! 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
+ 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
! 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
+ 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
! 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
+ 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
! 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
+ 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
! 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
+ 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
! 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
+ 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
m = 23
p = 27
-! !$omp parallel do simd collapse(3) lastprivate(p)
-! 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(p)
-! 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 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
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
+ 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
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
+ 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
+++ /dev/null
-! { dg-do compile }
-! { dg-additional-options "-msse2" { target sse2_runtime } }
-! { dg-additional-options "-mavx" { target avx_runtime } }
-
-! PR fortran/107424
-
-! Nonrectangular loop nests checks
-
-! ========================================================
-! NOTE: The testcases are from non-rectangular-loop-1.f90,
-! but commented there. Feel free to remove this
-! file + uncomment them in non-rectangular-loop-1.f90
-! Otherwise, you need to change it to 'dg-do run'!
-! ========================================================
-
-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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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 simd collapse(3) lastprivate(k) private(i,j)
- do i = 1, n
- do j = 1, m, 2 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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
-
-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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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
-
-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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = j - 41, p ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = i - 41, p ! { dg-note "Used here" }
- 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
-
-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(p)
- do i = 1, n
- do j = 1, m,2 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = 1, j + 41 ! { dg-note "Used here" }
- 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(p)
- do i = 1, n
- do j = 1, m,2 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = 1, j + 41 ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = 1, i + 41 ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = 1, j + 41 ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = 1, i + 41 ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
- do k = 1, j + 41 ! { dg-note "Used here" }
- 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 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'i'" }
- do j = 1, m
- do k = 1, i + 41 ! { dg-note "Used here" }
- 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
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }
-! PR fortran/107424
+! PR fortran/107424 - original PR
+! PR fortran/110735 - PR to implement the feature below
! Nonrectangular loop nests checks
+integer :: step
+step = -1
!$omp simd collapse(2)
do i = 1, 10
- do j = i, 10, 2 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
+ do j = i, 10, step ! { dg-message "sorry, unimplemented: non-rectangular loop nest with non-constant step for 'j'" }
end do
end do
+step = 3
!$omp do collapse(2) lastprivate(j) ! { dg-error "lastprivate variable 'j' is private in outer context" }
do i = 1, 10
- do j = i, 10, 2 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
+ do j = i, 10, step ! { dg-message "sorry, unimplemented: non-rectangular loop nest with non-constant step for 'j'" }
end do
end do
if (i /= 11) stop 1
+step = -5
!$omp simd collapse(2) lastprivate(j)
do i = 1, 10
- do j = i, 10, 2 ! { dg-message "sorry, unimplemented: non-rectangular loop nest with step other than constant 1 or -1 for 'j'" }
+ do j = i, 10, step ! { dg-message "sorry, unimplemented: non-rectangular loop nest with non-constant step for 'j'" }
end do
end do
if (i /= 11) stop 1
+
+step = -5
+!$omp simd collapse(2)
+do i = 1, 10, step ! { dg-message "sorry, unimplemented: non-rectangular loop nest with non-constant step for 'i'" }
+ do j = i, i ! { dg-note "Used here" }
+ end do
+end do
+if (i /= 11) stop 1
+
end
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-msse2" { target sse2_runtime } }
+! { dg-additional-options "-mavx" { target avx_runtime } }
+
+! PR fortran/107424
+
+! Nonrectangular loop nests checks
+! This testcase uses negative step sizes
+
+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, one
+
+ n = 11
+ m = 23
+ p = 27
+ one = 1
+
+ ! 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 = n, one, -1
+ do j = m, one, -2
+ do k = p + j, p - 41, -1
+ if (k < p - 41 .or. k > p+m) error stop
+ end do
+ end do
+ end do
+ if (k /= p - 41 - 1) error stop
+
+ !$omp simd collapse(3) lastprivate(k)
+ do i = n, 1, -2
+ do j = m, 1, -1
+ do k = p, i - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+
+ !$omp simd collapse(3) lastprivate(k)
+ do i = n, one, -2
+ do j = m, one, -1
+ do k = p, j - 41, -1
+ 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 /= -41) error stop
+
+ k = -43
+ m = 0
+ !$omp simd collapse(3) lastprivate(k)
+ do i = m, one, -2
+ do j = m, one, -1
+ do k = p, j - 41, -1
+ 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 = n, one, -1
+ do j = m, one, -2
+ do k = p, i - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+
+ n = -5
+ k = - 70
+ !$omp simd collapse(3) lastprivate(k)
+ do i = n, one, -1
+ do j = m, one, -2
+ do k = p, i - 41, -1
+ 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 = n, one, -1
+ do j = m, one, -2
+ do k = p, j - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+
+ !$omp simd collapse(3) lastprivate(k) private(i,j)
+ do i = n, one, -2
+ do j = m, one, -1
+ do k = p, i - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+
+ !$omp simd collapse(3) lastprivate(k) private(i,j)
+ do i = n, one, -2
+ do j = m, one, -1
+ do k = p, j - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+
+ !$omp simd collapse(3) lastprivate(k) private(i,j)
+ do i = n, one, -1
+ do j = m, one, -2
+ do k = p, i - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+
+ ! Same - but with lastprivate(i,j)
+
+ !$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
+ do i = n, one, -1
+ do j = m, one, -2
+ do k = p, j - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+ if (i /= 0 .or. j /= -1) error stop
+
+ !$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
+ do i = n, 1, -2
+ do j = m, one, -1
+ do k = p, i - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+ if (i /= -1 .or. j /= 0) error stop
+
+ !$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
+ do i = n, 1, -2
+ do j = m, 1, -1
+ do k = p, j - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+ if (i /= -1 .or. j /= 0) error stop
+
+ !$omp simd collapse(3) lastprivate(k) lastprivate(i,j)
+ do i = n, one, -1
+ do j = m, one, -2
+ do k = p, i - 41, -1
+ if (k < 1 - 41 .or. k > p) error stop
+ end do
+ end do
+ end do
+ if (k /= -41) error stop
+ if (i /= 0 .or. j /= -1) error stop
+end subroutine lastprivate_check_simd_1
+end module m
+
+program main
+ use m
+ implicit none (type, external)
+ call lastprivate_check_simd_1
+end