Commit af557050 by Tobias Burnus

[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.
parent 875d6cb3
2020-04-17 Tobias Burnus <tobias@codesourcery.com>
PR middle-end/94635
* gimplify.c (gimplify_scan_omp_clauses): Turn MAP_TO_PSET to
MAP_DELETE.
2020-04-17 Richard Sandiford <richard.sandiford@arm.com> 2020-04-17 Richard Sandiford <richard.sandiford@arm.com>
* config/aarch64/aarch64.c (aarch64_advsimd_ldp_stp_p): New function. * config/aarch64/aarch64.c (aarch64_advsimd_ldp_stp_p): New function.
......
...@@ -8785,10 +8785,14 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p, ...@@ -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:' 'exit data' - and in particular for 'delete:' - having an 'alloc:'
does not make sense. Likewise, for 'update' only transferring the does not make sense. Likewise, for 'update' only transferring the
data itself is needed as the rest has been handled in previous data itself is needed as the rest has been handled in previous
directives. */ directives. However, for 'exit data', the array descriptor needs
if ((code == OMP_TARGET_EXIT_DATA || code == OMP_TARGET_UPDATE) to be delete; hence, we turn the MAP_TO_PSET into a MAP_DELETE. */
&& (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER if (code == OMP_TARGET_EXIT_DATA
|| OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_TO_PSET)) && 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; remove = true;
if (remove) if (remove)
......
2020-04-17 Tobias Burnus <tobias@codesourcery.com>
PR middle-end/94635
* testsuite/libgomp.fortran/target-enter-data-2.F90: New.
2020-04-13 Thomas Schwinge <thomas@codesourcery.com> 2020-04-13 Thomas Schwinge <thomas@codesourcery.com>
PR libgomp/92843 PR libgomp/92843
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment