diff options
author | Julian Brown <julian@codesourcery.com> | 2023-04-26 14:31:53 +0000 |
---|---|---|
committer | Julian Brown <julian@codesourcery.com> | 2023-04-28 11:33:12 +0000 |
commit | cacf65d74463600815773255e8b82b4043432bd7 (patch) | |
tree | 1ef13704b0500f7584e44ca8d03d3ad0b25e0783 /libgomp/testsuite/libgomp.fortran | |
parent | 6e6f86f22873aab7059e083fd0c9905bd58e5efa (diff) | |
download | gcc-cacf65d74463600815773255e8b82b4043432bd7.zip gcc-cacf65d74463600815773255e8b82b4043432bd7.tar.gz gcc-cacf65d74463600815773255e8b82b4043432bd7.tar.bz2 |
OpenACC: Stand-alone attach/detach clause fixes for Fortran [PR109622]
This patch fixes several cases where multiple attach or detach mapping
nodes were being created for stand-alone attach or detach clauses
in Fortran. After the introduction of stricter checking later during
compilation, these extra nodes could cause ICEs, as seen in the PR.
The patch also fixes cases that "happened to work" previously where
the user attaches/detaches a pointer to array using a descriptor, and
(I think!) the "_data" field has offset zero, hence the same address as
the descriptor as a whole.
2023-04-27 Julian Brown <julian@codesourcery.com>
PR fortran/109622
gcc/fortran/
* trans-openmp.cc (gfc_trans_omp_clauses): Attach/detach clause fixes.
gcc/testsuite/
* gfortran.dg/goacc/attach-descriptor.f90: Adjust expected output.
libgomp/
* testsuite/libgomp.fortran/pr109622.f90: New test.
* testsuite/libgomp.fortran/pr109622-2.f90: New test.
* testsuite/libgomp.fortran/pr109622-3.f90: New test.
Diffstat (limited to 'libgomp/testsuite/libgomp.fortran')
-rw-r--r-- | libgomp/testsuite/libgomp.fortran/pr109622-2.f90 | 32 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.fortran/pr109622-3.f90 | 32 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.fortran/pr109622.f90 | 32 |
3 files changed, 96 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.fortran/pr109622-2.f90 b/libgomp/testsuite/libgomp.fortran/pr109622-2.f90 new file mode 100644 index 0000000..8c5f373 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr109622-2.f90 @@ -0,0 +1,32 @@ +! { dg-do run } + +type t +integer :: foo +integer, pointer :: bar +end type t + +type(t) :: var +integer, target :: tgt + +var%bar => tgt + +var%foo = 99 +tgt = 199 + +!$acc enter data copyin(var) + +!$acc enter data attach(var%bar) + +!$acc serial +var%foo = 5 +var%bar = 7 +!$acc end serial + +!$acc exit data detach(var%bar) + +!$acc exit data copyout(var) + +if (var%foo.ne.5) stop 1 +if (tgt.ne.7) stop 2 + +end diff --git a/libgomp/testsuite/libgomp.fortran/pr109622-3.f90 b/libgomp/testsuite/libgomp.fortran/pr109622-3.f90 new file mode 100644 index 0000000..3ee1b43 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr109622-3.f90 @@ -0,0 +1,32 @@ +! { dg-do run } + +type t +integer :: foo +integer, pointer :: bar(:) +end type t + +type(t) :: var +integer, target :: tgt(20) + +var%bar => tgt + +var%foo = 99 +tgt = 199 + +!$acc enter data copyin(var, tgt) + +!$acc enter data attach(var%bar) + +!$acc serial +var%foo = 5 +var%bar = 7 +!$acc end serial + +!$acc exit data detach(var%bar) + +!$acc exit data copyout(var, tgt) + +if (var%foo.ne.5) stop 1 +if (any(tgt.ne.7)) stop 2 + +end diff --git a/libgomp/testsuite/libgomp.fortran/pr109622.f90 b/libgomp/testsuite/libgomp.fortran/pr109622.f90 new file mode 100644 index 0000000..5b8c410 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr109622.f90 @@ -0,0 +1,32 @@ +! { dg-do run } + +type t +integer :: value +type(t), pointer :: chain +end type t + +type(t), target :: var, var2 + +var%value = 99 +var2%value = 199 + +var%chain => var2 +nullify(var2%chain) + +!$acc enter data copyin(var, var2) + +!$acc enter data attach(var%chain) + +!$acc serial +var%value = 5 +var%chain%value = 7 +!$acc end serial + +!$acc exit data detach(var%chain) + +!$acc exit data copyout(var, var2) + +if (var%value.ne.5) stop 1 +if (var2%value.ne.7) stop 2 + +end |