From 9f0f7da9aa98eec28b4e5e34ade0aa0028df161d Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Fri, 15 May 2020 11:50:34 +0200 Subject: [PATCH] [OpenMP] Fix 'omp exit data' for Fortran arrays (PR 94635) gcc/ 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:'. gcc/testsuite PR middle-end/94635 * gfortran.dg/gomp/target-exit-data.f90: New. --- gcc/ChangeLog | 7 +++++++ gcc/gimplify.c | 4 +++- gcc/testsuite/ChangeLog | 5 +++++ .../gfortran.dg/gomp/target-exit-data.f90 | 20 +++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/gomp/target-exit-data.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 587db3969cd..592ca9bfd31 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2020-05-15 Tobias Burnus + + 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:'. + 2020-05-15 Uroš Bizjak PR target/95046 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 1d532e6f373..e104e766517 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -8766,7 +8766,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/ChangeLog b/gcc/testsuite/ChangeLog index 4a7988f8a5c..6b8b52dae2e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-15 Tobias Burnus + + PR middle-end/94635 + * gfortran.dg/gomp/target-exit-data.f90: New. + 2020-05-15 Uroš Bizjak PR target/95046 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" } } -- 2.43.5