diff options
author | Julian Brown <julian@codesourcery.com> | 2020-01-03 10:06:15 -0800 |
---|---|---|
committer | Julian Brown <julian@codesourcery.com> | 2020-01-28 06:00:29 -0800 |
commit | 278c3214b344ac7c5daf974196fbebc531bff058 (patch) | |
tree | 5fb64b46ceb10ceee9647519ec7b68320c82abc8 | |
parent | 99b9f5b4067a8c5c5a706694b9a23516126984de (diff) | |
download | gcc-278c3214b344ac7c5daf974196fbebc531bff058.zip gcc-278c3214b344ac7c5daf974196fbebc531bff058.tar.gz gcc-278c3214b344ac7c5daf974196fbebc531bff058.tar.bz2 |
Don't allow mixed component and non-component accesses for OpenACC/Fortran
gcc/fortran/
* gfortran.h (gfc_symbol): Add comp_mark bitfield.
* openmp.c (resolve_omp_clauses): Disallow mixed component and
full-derived-type accesses to the same variable within a single
directive.
libgomp/
* testsuite/libgomp.oacc-fortran/deep-copy-2.f90: Remove test from here.
* testsuite/libgomp.oacc-fortran/deep-copy-3.f90: Don't use mixed
component/non-component variable refs in a single directive.
* testsuite/libgomp.oacc-fortran/classtypes-1.f95: Likewise.
gcc/testsuite/
* gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp
testsuite). Make a compilation test, and expect rejection of mixed
component/non-component accesses.
* gfortran.dg/goacc/mapping-tests-1.f90: New test.
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/gfortran.h | 6 | ||||
-rw-r--r-- | gcc/fortran/openmp.c | 33 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90 (renamed from libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90) | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90 | 15 | ||||
-rw-r--r-- | libgomp/ChangeLog | 7 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95 | 6 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90 | 4 |
9 files changed, 71 insertions, 22 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index eb8842b..c51dab2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2020-01-28 Julian Brown <julian@codesourcery.com> + + * gfortran.h (gfc_symbol): Add comp_mark bitfield. + * openmp.c (resolve_omp_clauses): Disallow mixed component and + full-derived-type accesses to the same variable within a single + directive. + 2020-01-28 Tobias Burnus <tobias@codesourcery.com> PR fortran/93464 diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index df07eee..dbf03fb 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1592,9 +1592,11 @@ typedef struct gfc_symbol current statement have the mark member nonzero. Of these symbols, symbols with old_symbol equal to NULL are symbols created within the current statement. Otherwise, old_symbol points to a copy of - the old symbol. gfc_new is used in symbol.c to flag new symbols. */ + the old symbol. gfc_new is used in symbol.c to flag new symbols. + comp_mark is used to indicate variables which have component accesses + in OpenMP/OpenACC directive clauses. */ struct gfc_symbol *old_symbol; - unsigned mark:1, gfc_new:1; + unsigned mark:1, comp_mark:1, gfc_new:1; /* The tlink field is used in the front end to carry the module declaration of separate module procedures so that the characteristics diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 3c61385..444fdcc 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -4248,6 +4248,7 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, for (n = omp_clauses->lists[list]; n; n = n->next) { n->sym->mark = 0; + n->sym->comp_mark = 0; if (n->sym->attr.flavor == FL_VARIABLE || n->sym->attr.proc_pointer || (!code && (!n->sym->attr.dummy || n->sym->ns != ns))) @@ -4313,23 +4314,25 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses, && (list != OMP_LIST_REDUCTION || !openacc)) for (n = omp_clauses->lists[list]; n; n = n->next) { - bool array_only_p = true; - /* Disallow duplicate bare variable references and multiple - subarrays of the same array here, but allow multiple components of - the same (e.g. derived-type) variable. For the latter, duplicate - components are detected elsewhere. */ - if (openacc && n->expr && n->expr->expr_type == EXPR_VARIABLE) + bool component_ref_p = false; + + /* Allow multiple components of the same (e.g. derived-type) + variable here. Duplicate components are detected elsewhere. */ + if (n->expr && n->expr->expr_type == EXPR_VARIABLE) for (gfc_ref *ref = n->expr->ref; ref; ref = ref->next) - if (ref->type != REF_ARRAY) - { - array_only_p = false; - break; - } - if (array_only_p) + if (ref->type == REF_COMPONENT) + component_ref_p = true; + if ((!component_ref_p && n->sym->comp_mark) + || (component_ref_p && n->sym->mark)) + gfc_error ("Symbol %qs has mixed component and non-component " + "accesses at %L", n->sym->name, &n->where); + else if (n->sym->mark) + gfc_error ("Symbol %qs present on multiple clauses at %L", + n->sym->name, &n->where); + else { - if (n->sym->mark) - gfc_error ("Symbol %qs present on multiple clauses at %L", - n->sym->name, &n->where); + if (component_ref_p) + n->sym->comp_mark = 1; else n->sym->mark = 1; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1b9436f..a362367 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-01-28 Julian Brown <julian@codesourcery.com> + + * gfortran.dg/goacc/deep-copy-2.f90: Move test here (from libgomp + testsuite). Make a compilation test, and expect rejection of mixed + component/non-component accesses. + * gfortran.dg/goacc/mapping-tests-1.f90: New test. + 2020-01-28 Tobias Burnus <tobias@codesourcery.com> Julian Brown <julian@codesourcery.com> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90 b/gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90 index 3593661..1e556b1 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-2.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/deep-copy-2.f90 @@ -1,4 +1,4 @@ -! { dg-do run } +! { dg-do compile } ! Test of attach/detach with "acc data", two clauses at once. @@ -14,7 +14,9 @@ program dtype allocate(var%a(1:n)) -!$acc data copy(var) copy(var%a) +!$acc data copy(var) copy(var%a) ! { dg-error "Symbol .var. has mixed component and non-component accesses" } + +!$acc data copy(var%a) copy(var) ! { dg-error "Symbol .var. has mixed component and non-component accesses" } !$acc parallel loop do i = 1,n @@ -24,6 +26,8 @@ program dtype !$acc end data +!$acc end data + do i = 1,n if (i .ne. var%a(i)) stop 1 end do diff --git a/gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90 b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90 new file mode 100644 index 0000000..c1bfe58 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/mapping-tests-1.f90 @@ -0,0 +1,15 @@ +! { dg-do compile } + +subroutine foo + type t + integer :: i, j + end type t + + type(t) x + + ! We should reject the duplicate reference here. +!$acc enter data copyin(x%i, x%i) +! { dg-error ".x.i. appears more than once in map clauses" "" { target "*-*-*" } 11 } + + +end diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index b8fa7d4..9fa6bd1 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,10 @@ +2020-01-28 Julian Brown <julian@codesourcery.com> + + * testsuite/libgomp.oacc-fortran/deep-copy-2.f90: Remove test from here. + * testsuite/libgomp.oacc-fortran/deep-copy-3.f90: Don't use mixed + component/non-component variable refs in a single directive. + * testsuite/libgomp.oacc-fortran/classtypes-1.f95: Likewise. + 2020-01-24 Maciej W. Rozycki <macro@wdc.com> * configure.ac: Handle `--with-toolexeclibdir='. diff --git a/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95 b/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95 index f16f42f..c5f0fff 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95 +++ b/libgomp/testsuite/libgomp.oacc-fortran/classtypes-1.f95 @@ -31,7 +31,8 @@ program main myvar%p%p(i) = -1.0 end do -!$acc enter data copyin(myvar, myvar%p) create(myvar%p%p) +!$acc enter data copyin(myvar) +!$acc enter data copyin(myvar%p) create(myvar%p%p) !$acc parallel loop present(myvar%p%p) do i=1,100 @@ -39,7 +40,8 @@ program main end do !$acc end parallel loop -!$acc exit data copyout(myvar%p%p) delete(myvar, myvar%p) +!$acc exit data copyout(myvar%p%p) delete(myvar%p) +!$acc exit data delete(myvar) do i=1,100 if (myvar%p%p(i) .ne. i * 2) stop 1 diff --git a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90 b/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90 index 667d944..edb6b8d 100644 --- a/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90 +++ b/libgomp/testsuite/libgomp.oacc-fortran/deep-copy-3.f90 @@ -16,12 +16,14 @@ program dtype allocate(var%a(1:n)) allocate(var%b(1:n)) -!$acc parallel loop copy(var) copy(var%a(1:n)) copy(var%b(1:n)) +!$acc data copy(var) +!$acc parallel loop copy(var%a(1:n)) copy(var%b(1:n)) do i = 1,n var%a(i) = i var%b(i) = i end do !$acc end parallel loop +!$acc end data do i = 1,n if (i .ne. var%a(i)) stop 1 |