On 4/20/20 11:33 PM, Thomas Schwinge wrote:
Really 'GOMP_MAP_DELETE', or should that rather be 'GOMP_MAP_RELEASE'?
Depends on the previous item, i.e. 'delete:' vs. 'release:/from:/…' Rather obvious – OK? Tobias ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
[OpenMP] Fix 'omp exit data' for Fortran arrays (PR 94635) PR middle-end/94635 * gimplify.c (gimplify_scan_omp_clauses): For MAP_TO_PSET with OMP_TARGET_EXIT_DATA, use 'release:' unless the associated item is 'delete:'. PR middle-end/94635 * gfortran.dg/gomp/target-exit-data.f90: New. gcc/gimplify.c | 4 +++- gcc/testsuite/gfortran.dg/gomp/target-exit-data.f90 | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 2f2c51b2d89..0bac9900210 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -8789,7 +8789,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, 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); + OMP_CLAUSE_SET_MAP_KIND (c, OMP_CLAUSE_MAP_KIND (*prev_list_p) + == GOMP_MAP_DELETE + ? GOMP_MAP_DELETE : GOMP_MAP_RELEASE); 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)) diff --git a/gcc/testsuite/gfortran.dg/gomp/target-exit-data.f90 b/gcc/testsuite/gfortran.dg/gomp/target-exit-data.f90 new file mode 100644 index 00000000000..ed57d0072d7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/target-exit-data.f90 @@ -0,0 +1,20 @@ +! { dg-do compile } +! { dg-additional-options "-fdump-tree-omplower" } +! +! PR middle-end/94635 + +integer, allocatable :: one(:), two(:), three(:) + +!$omp target enter data map(alloc:one) +!$omp target enter data map(alloc:two) +!$omp target enter data map(to:three) + +! ... +!$omp target exit data map(delete:one) +!$omp target exit data map(release:two) +!$omp target exit data map(from:three) +end + +! { dg-final { scan-tree-dump "omp target exit data map\\(delete:.*\\) map\\(delete:one \\\[len: .*\\\]\\)" "omplower" } } +! { dg-final { scan-tree-dump "omp target exit data map\\(release:.*\\) map\\(release:two \\\[len: .*\\\]\\)" "omplower" } } +! { dg-final { scan-tree-dump "omp target exit data map\\(from:.*\\) map\\(release:three \\\[len: .*\\\]\\)" "omplower" } }