From a7c5803d4e56c6f6c84a9c5b08adffb0cfe1d79f Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Tue, 19 May 2020 10:10:21 +0200 Subject: [PATCH] [OpenMP] Fix 'omp exit data' for Fortran arrays (PR 94635) Backport from mainline 2020-05-15 Tobias Burnus 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 | 10 ++++++++++ gcc/gimplify.c | 4 +++- gcc/testsuite/ChangeLog | 10 +++++++++- .../gfortran.dg/gomp/target-exit-data.f90 | 20 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/gomp/target-exit-data.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f51c0fb6b45d..9beb81aea1ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2020-05-19 Tobias Burnus + + Backport from mainline + 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-18 Martin Sebor PR middle-end/94940 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 2f2c51b2d894..0bac99002102 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/ChangeLog b/gcc/testsuite/ChangeLog index d627f6ebda97..4b26ffc6998a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-05-19 Tobias Burnus + + Backport from mainline + 2020-05-15 Tobias Burnus + + PR middle-end/94635 + * gfortran.dg/gomp/target-exit-data.f90: New. + 2020-05-18 Martin Sebor PR middle-end/94940 @@ -18,7 +26,7 @@ 2020-05-13 Mark Eggleston Backport from master - 2020-05-13 Mark Eggleston + 2020-05-13 Mark Eggleston PR fortran/93497 * gfortran.dg/pr88025.f90: Change in wording of error. 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 000000000000..ed57d0072d75 --- /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.47.2