From af557050fd011a03d21dc26b31959033061a0443 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Fri, 17 Apr 2020 19:08:55 +0200 Subject: [PATCH] [OpenMP] Fix 'omp exit data' for Fortran arrays (PR 94635) PR middle-end/94635 * gimplify.c (gimplify_scan_omp_clauses): Turn MAP_TO_PSET to MAP_DELETE. PR middle-end/94635 * testsuite/libgomp.fortran/target-enter-data-2.F90: New. --- gcc/ChangeLog | 6 +++ gcc/gimplify.c | 12 ++++-- libgomp/ChangeLog | 5 +++ .../libgomp.fortran/target-enter-data-2.F90 | 40 +++++++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 75540e89b69..93badc209ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-04-17 Tobias Burnus + + PR middle-end/94635 + * gimplify.c (gimplify_scan_omp_clauses): Turn MAP_TO_PSET to + MAP_DELETE. + 2020-04-17 Richard Sandiford * config/aarch64/aarch64.c (aarch64_advsimd_ldp_stp_p): New function. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 8cdfae26510..2f2c51b2d89 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -8785,10 +8785,14 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, 'exit data' - and in particular for 'delete:' - having an 'alloc:' does not make sense. Likewise, for 'update' only transferring the data itself is needed as the rest has been handled in previous - directives. */ - if ((code == OMP_TARGET_EXIT_DATA || code == OMP_TARGET_UPDATE) - && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER - || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_TO_PSET)) + directives. However, for 'exit data', the array descriptor needs + to be delete; hence, we turn the MAP_TO_PSET into a MAP_DELETE. */ + if (code == OMP_TARGET_EXIT_DATA + && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_TO_PSET) + OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_DELETE); + else if ((code == OMP_TARGET_EXIT_DATA || code == OMP_TARGET_UPDATE) + && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER + || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_TO_PSET)) remove = true; if (remove) diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 8f351f61f33..ce71ac6e783 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,8 @@ +2020-04-17 Tobias Burnus + + PR middle-end/94635 + * testsuite/libgomp.fortran/target-enter-data-2.F90: New. + 2020-04-13 Thomas Schwinge PR libgomp/92843 diff --git a/libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90 b/libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90 new file mode 100644 index 00000000000..320d8bf419f --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90 @@ -0,0 +1,40 @@ +! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } } +! +! PR middle-end/94635 + implicit none + integer, parameter :: N = 20 + integer, allocatable, dimension(:) :: my1DPtr + integer, dimension(N) :: my1DArr + integer :: i + + allocate(my1DPtr(N)) + my1DPtr = 43 + + !$omp target enter data map(alloc: my1DPtr) + !$omp target + my1DPtr = [(i , i = 1, N)] + !$omp end target + + !$omp target map(from: my1DArr) + my1DArr = my1DPtr + !$omp end target + !$omp target exit data map(delete: my1DPtr) + + if (any (my1DArr /= [(i, i = 1, N)])) stop 1 +#if MEM_SHARED + if (any (my1DArr /= my1DPtr)) stop 2 +#else + if (any (43 /= my1DPtr)) stop 3 +#endif + + my1DPtr = [(2*N-i, i = 1, N)] + my1DArr = 42 + + !$omp target map(tofrom: my1DArr) map(tofrom: my1DPtr(:)) + my1DArr = my1DPtr + my1DPtr = 20 + !$omp end target + + if (any (my1DArr /= [(2*N-i, i = 1, N)])) stop 4 + if (any (20 /= my1DPtr)) stop 6 +end -- 2.30.2