Commit a5ed4958 by Julian Brown

Check array contiguity for OpenACC/Fortran

	PR fortran/93025

	gcc/fortran/
	* openmp.c (resolve_omp_clauses): Check array references for contiguity.

	gcc/testsuite/
	* gfortran.dg/goacc/mapping-tests-2.f90: New test.
	* gfortran.dg/goacc/subarrays.f95: Expect rejection of non-contiguous
	array.
parent 278c3214
2020-01-28 Julian Brown <julian@codesourcery.com> 2020-01-28 Julian Brown <julian@codesourcery.com>
PR fortran/93025
* openmp.c (resolve_omp_clauses): Check array references for contiguity.
2020-01-28 Julian Brown <julian@codesourcery.com>
* gfortran.h (gfc_symbol): Add comp_mark bitfield. * gfortran.h (gfc_symbol): Add comp_mark bitfield.
* openmp.c (resolve_omp_clauses): Disallow mixed component and * openmp.c (resolve_omp_clauses): Disallow mixed component and
full-derived-type accesses to the same variable within a single full-derived-type accesses to the same variable within a single
......
...@@ -4536,13 +4536,28 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, ...@@ -4536,13 +4536,28 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
/* Look through component refs to find last array /* Look through component refs to find last array
reference. */ reference. */
if (openacc && resolved) if (openacc && resolved)
while (array_ref {
&& (array_ref->type == REF_COMPONENT /* The "!$acc cache" directive allows rectangular
|| (array_ref->type == REF_ARRAY subarrays to be specified, with some restrictions
&& array_ref->next on the form of bounds (not implemented).
&& (array_ref->next->type Only raise an error here if we're really sure the
== REF_COMPONENT)))) array isn't contiguous. An expression such as
array_ref = array_ref->next; arr(-n:n,-n:n) could be contiguous even if it looks
like it may not be. */
if (list != OMP_LIST_CACHE
&& !gfc_is_simply_contiguous (n->expr, false, true)
&& gfc_is_not_contiguous (n->expr))
gfc_error ("Array is not contiguous at %L",
&n->where);
while (array_ref
&& (array_ref->type == REF_COMPONENT
|| (array_ref->type == REF_ARRAY
&& array_ref->next
&& (array_ref->next->type
== REF_COMPONENT))))
array_ref = array_ref->next;
}
} }
if (array_ref if (array_ref
|| (n->expr || (n->expr
......
2020-01-28 Tobias Burnus <tobias@codesourcery.com>
Julian Brown <julian@codesourcery.com>
* gfortran.dg/goacc/mapping-tests-2.f90: New test.
* gfortran.dg/goacc/subarrays.f95: Expect rejection of non-contiguous
array.
2020-01-28 Julian Brown <julian@codesourcery.com> 2020-01-28 Julian Brown <julian@codesourcery.com>
* gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp * gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp
......
subroutine foo
type t
integer :: i, j
end type t
type t2
type(t) :: cc(3)
end type t2
type(t) x, y(3)
type(t2) :: z(3)
! OK - map whole aggregated variable
!$acc enter data copyin(x)
! map(to:x [len: 8])
! OK - map two components of the aggregated variable
!$acc enter data copyin(x%j, x%i)
! Bad - we cannot mix full-object and component accesses
!$acc enter data copyin(x, x%i)
! { dg-error "Symbol .x. has mixed component and non-component accesses" "" { target "*-*-*" } 21 }
! Bad - we cannot do a strided access of 'x'
! No C/C++ equivalent
!$acc enter data copyin(y(:)%i)
! { dg-error "Array is not contiguous" "" { target "*-*-*" } 26 }
! Bad - again, a strided access
!$acc enter data copyin(z(1)%cc(:)%i)
! { dg-error "Array is not contiguous" "" { target "*-*-*" } 30 }
end
...@@ -27,7 +27,7 @@ program test ...@@ -27,7 +27,7 @@ program test
! { dg-error "'a' in MAP clause" "" { target *-*-* } .-2 } ! { dg-error "'a' in MAP clause" "" { target *-*-* } .-2 }
!$acc end parallel !$acc end parallel
!$acc parallel copy (b(1:3,2:4)) !$acc parallel copy (b(1:3,2:4)) ! { dg-error "Array is not contiguous" }
!$acc end parallel !$acc end parallel
!$acc parallel copy (b(2:3)) !$acc parallel copy (b(2:3))
! { dg-error "Rank mismatch" "" { target *-*-* } .-1 } ! { dg-error "Rank mismatch" "" { target *-*-* } .-1 }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment