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>
* 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,
'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)
......
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>
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