From 3ad47717bf7163ed1628c829e06166a74c1e9cd3 Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Mon, 20 Feb 2023 12:23:14 +0000 Subject: [PATCH] libgomp: no need to attach USM pointers Fix a bug in which Fortran pointers inside derived types caused a runtime error when Unified Shared Memory was active. libgomp/ChangeLog: * target.c (gomp_attach_pointer): Check for USM. * testsuite/libgomp.fortran/usm-3.f90: New test. --- libgomp/ChangeLog.omp | 5 ++++ libgomp/target.c | 5 ++++ libgomp/testsuite/libgomp.fortran/usm-3.f90 | 33 +++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 libgomp/testsuite/libgomp.fortran/usm-3.f90 diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp index 98f046c292af..51c15697e72f 100644 --- a/libgomp/ChangeLog.omp +++ b/libgomp/ChangeLog.omp @@ -1,3 +1,8 @@ +2023-02-23 Andrew Stubbs + + * target.c (gomp_attach_pointer): Check for USM. + * testsuite/libgomp.fortran/usm-3.f90: New test. + 2023-02-22 Tobias Burnus * testsuite/libgomp.fortran/target-enter-data-3.f90: Uncomment diff --git a/libgomp/target.c b/libgomp/target.c index 24109f28ddce..fcc5b9dabcab 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -836,6 +836,11 @@ gomp_attach_pointer (struct gomp_device_descr *devicep, gomp_fatal ("attempt to attach null pointer"); } + if (devicep->is_usm_ptr_func + && devicep->is_usm_ptr_func ((void*)(target + bias))) + /* Nothing to do here. */ + return; + s.host_start = target + bias; s.host_end = s.host_start + 1; tn = splay_tree_lookup (mem_map, &s); diff --git a/libgomp/testsuite/libgomp.fortran/usm-3.f90 b/libgomp/testsuite/libgomp.fortran/usm-3.f90 new file mode 100644 index 000000000000..ff15f4ba1f54 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/usm-3.f90 @@ -0,0 +1,33 @@ +! { dg-do run } +! { dg-require-effective-target omp_usm } + +! Ensure that derived types containing allocated values work +! with Unified Shared Memory. + +program usm +!$omp requires unified_shared_memory + use iso_fortran_env + implicit none + + type :: struct + real(real64), allocatable :: v(:) + end type struct + + integer :: index + type(struct) :: s + + real(real64), allocatable :: expected(:) + + allocate(s%v(100)) + do index = 1, size(s%v) + s%v(index) = index + end do + allocate(expected, mold=s%v) + expected = s%v - 1._real64 + + !$omp target + s%v = s%v - 1._real64 + !$omp end target + + if (any(s%v /= expected)) STOP 1 +end program usm -- 2.47.2