Fortran/OpenMP] Don't create "alloc:" for 'target exit data'
gcc/ * gimplify.c (gimplify_scan_omp_clauses): Remove FE-generated GOMP_MAP_TO_PSET and GOMP_MAP_POINTER mapping for 'target update' and 'target exit data'. libgomp/ * testsuite/libgomp.fortran/target9.f90: New. From-SVN: r277631
This commit is contained in:
parent
d03eca30d7
commit
91ae0a46fd
4 changed files with 144 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2019-10-30 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
* gimplify.c (gimplify_scan_omp_clauses): Remove FE-generated
|
||||
GOMP_MAP_TO_PSET and GOMP_MAP_POINTER mapping for 'target update'
|
||||
and 'target exit data'.
|
||||
|
||||
2019-10-30 Martin Jambor <mjambor@suse.cz>
|
||||
|
||||
ipa/92278
|
||||
|
|
|
@ -8590,6 +8590,17 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
|
|||
default:
|
||||
break;
|
||||
}
|
||||
/* For Fortran, not only the pointer to the data is mapped but also
|
||||
the address of the pointer, the array descriptor etc.; for
|
||||
'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))
|
||||
remove = true;
|
||||
|
||||
if (remove)
|
||||
break;
|
||||
if (DECL_P (decl) && outer_ctx && (region_type & ORT_ACC))
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2019-10-30 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
* testsuite/libgomp.fortran/target9.f90: New.
|
||||
|
||||
2019-10-30 Tobias Burnus <tobias@codesourcery.com>
|
||||
|
||||
* testsuite/libgomp.fortran/aligned1.f03: Replace 'STOP' by 'stop'.
|
||||
|
|
123
libgomp/testsuite/libgomp.fortran/target9.f90
Normal file
123
libgomp/testsuite/libgomp.fortran/target9.f90
Normal file
|
@ -0,0 +1,123 @@
|
|||
! { dg-require-effective-target offload_device_nonshared_as } */
|
||||
|
||||
module target_test
|
||||
implicit none (type, external)
|
||||
integer, parameter :: N = 40
|
||||
integer :: sum
|
||||
integer :: var1 = 1
|
||||
integer :: var2 = 2
|
||||
|
||||
!$omp declare target to(D)
|
||||
integer :: D(N) = 0
|
||||
contains
|
||||
subroutine enter_data (X)
|
||||
integer :: X(:)
|
||||
!$omp target enter data map(to: var1, var2, X) map(alloc: sum)
|
||||
end subroutine enter_data
|
||||
|
||||
subroutine exit_data_0 (D)
|
||||
integer :: D(N)
|
||||
!$omp target exit data map(delete: D)
|
||||
end subroutine exit_data_0
|
||||
|
||||
subroutine exit_data_1 ()
|
||||
!$omp target exit data map(from: var1)
|
||||
end subroutine exit_data_1
|
||||
|
||||
subroutine exit_data_2 (X)
|
||||
integer :: X(N)
|
||||
!$omp target exit data map(from: var2) map(release: X, sum)
|
||||
end subroutine exit_data_2
|
||||
|
||||
subroutine exit_data_3 (p, idx)
|
||||
integer :: p(:)
|
||||
integer, value :: idx
|
||||
!$omp target exit data map(from: p(idx))
|
||||
end subroutine exit_data_3
|
||||
|
||||
subroutine test_nested ()
|
||||
integer :: X, Y, Z
|
||||
X = 0
|
||||
Y = 0
|
||||
Z = 0
|
||||
|
||||
!$omp target data map(from: X, Y, Z)
|
||||
!$omp target data map(from: X, Y, Z)
|
||||
!$omp target map(from: X, Y, Z)
|
||||
X = 1337
|
||||
Y = 1337
|
||||
Z = 1337
|
||||
!$omp end target
|
||||
if (X /= 0) stop 11
|
||||
if (Y /= 0) stop 12
|
||||
if (Z /= 0) stop 13
|
||||
|
||||
!$omp target exit data map(from: X) map(release: Y)
|
||||
if (X /= 0) stop 14
|
||||
if (Y /= 0) stop 15
|
||||
|
||||
!$omp target exit data map(release: Y) map(delete: Z)
|
||||
if (Y /= 0) stop 16
|
||||
if (Z /= 0) stop 17
|
||||
!$omp end target data
|
||||
if (X /= 1337) stop 18
|
||||
if (Y /= 0) stop 19
|
||||
if (Z /= 0) stop 20
|
||||
|
||||
!$omp target map(from: X)
|
||||
X = 2448
|
||||
!$omp end target
|
||||
if (X /= 2448) stop 21
|
||||
if (Y /= 0) stop 22
|
||||
if (Z /= 0) stop 23
|
||||
|
||||
X = 4896
|
||||
!$omp end target data
|
||||
if (X /= 4896) stop 24
|
||||
if (Y /= 0) stop 25
|
||||
if (Z /= 0) stop 26
|
||||
end subroutine test_nested
|
||||
end module target_test
|
||||
|
||||
program main
|
||||
use target_test
|
||||
implicit none (type, external)
|
||||
|
||||
integer, allocatable :: X(:)
|
||||
integer, pointer, contiguous :: Y(:)
|
||||
|
||||
|
||||
allocate(X(N), Y(N))
|
||||
X(10) = 10
|
||||
Y(20) = 20
|
||||
call enter_data (X)
|
||||
|
||||
call exit_data_0 (D) ! This should have no effect on D.
|
||||
|
||||
!$omp target map(alloc: var1, var2, X) map(to: Y) map(always, from: sum)
|
||||
var1 = var1 + X(10)
|
||||
var2 = var2 + Y(20)
|
||||
sum = var1 + var2
|
||||
D(sum) = D(sum) + 1
|
||||
!$omp end target
|
||||
|
||||
if (var1 /= 1) stop 1
|
||||
if (var2 /= 2) stop 2
|
||||
if (sum /= 33) stop 3
|
||||
|
||||
call exit_data_1 ()
|
||||
if (var1 /= 11) stop 4
|
||||
if (var2 /= 2) stop 5
|
||||
|
||||
! Increase refcount of already mapped X(1:N).
|
||||
!$omp target enter data map(alloc: X(16:17))
|
||||
|
||||
call exit_data_2 (X)
|
||||
if (var2 /= 22) stop 6
|
||||
|
||||
call exit_data_3 (X, 5) ! Unmap X(1:N).
|
||||
|
||||
deallocate (X, Y)
|
||||
|
||||
call test_nested ()
|
||||
end program main
|
Loading…
Add table
Reference in a new issue