From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1534) id 4D4C63858D20; Fri, 3 Feb 2023 10:34:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4D4C63858D20 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1675420455; bh=ueNgTY8QvOsHFHyrDHfMjoXeNg5Gp/3+F/f2n9Oq6GE=; h=From:To:Subject:Date:From; b=NYK8+ft2EW+rA80rvJ8Yx/l8cUHI0blEyI4fE8FWah2IejY+JwJw7TY/MAEYAWAbt oqM169dF9EtzUKk6jC3mmiLh2ERqQrhpbDomf80z2GP0yPkAbiWZzWtEN67B2bdXHj gvZxOtr4l5JA0j3ane4rEThugv24XuGUvgovALzE= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Tobias Burnus To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-5680] libgomp: Fix reverse offload issues X-Act-Checkin: gcc X-Git-Author: Tobias Burnus X-Git-Refname: refs/heads/master X-Git-Oldrev: f84fdb134dec02f68fd9a39a58e726023470e537 X-Git-Newrev: 0b1ce70a813b98ef2893779d14ad6c90c5d06a71 Message-Id: <20230203103415.4D4C63858D20@sourceware.org> Date: Fri, 3 Feb 2023 10:34:15 +0000 (GMT) List-Id: https://gcc.gnu.org/g:0b1ce70a813b98ef2893779d14ad6c90c5d06a71 commit r13-5680-g0b1ce70a813b98ef2893779d14ad6c90c5d06a71 Author: Tobias Burnus Date: Fri Feb 3 11:31:53 2023 +0100 libgomp: Fix reverse offload issues If there is nothing to map, skip the mapping and avoid attempting to copy 0 bytes from addrs, sizes and kinds. Additionally, it could happen that a non-allocated address was deallocated, such as a pointer set, leading to a free for the actual data. libgomp/ * target.c (gomp_target_rev): Handle mapnum == 0 and avoid freeing not allocated memory. * testsuite/libgomp.fortran/reverse-offload-6.f90: New test. Diff: --- libgomp/target.c | 8 +++--- .../libgomp.fortran/reverse-offload-6.f90 | 32 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/libgomp/target.c b/libgomp/target.c index b16ee761a95..c1682caea13 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -3324,7 +3324,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr, gomp_fatal ("Cannot find reverse-offload function"); void (*host_fn)() = (void (*)()) n->k->host_start; - if (devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) + if ((devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) || mapnum == 0) { devaddrs = (uint64_t *) (uintptr_t) devaddrs_ptr; sizes = (uint64_t *) (uintptr_t) sizes_ptr; @@ -3402,7 +3402,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr, } } - if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)) + if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) && mapnum > 0) { size_t j, struct_cpy = 0; splay_tree_key n2; @@ -3638,7 +3638,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr, host_fn (devaddrs); - if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM)) + if (!(devicep->capabilities & GOMP_OFFLOAD_CAP_SHARED_MEM) && mapnum > 0) { uint64_t struct_cpy = 0; bool clean_struct = false; @@ -3680,7 +3680,7 @@ gomp_target_rev (uint64_t fn_ptr, uint64_t mapnum, uint64_t devaddrs_ptr, clean_struct = true; struct_cpy = sizes[i]; } - else if (cdata[i].aligned) + else if (!cdata[i].present && cdata[i].aligned) gomp_aligned_free ((void *) (uintptr_t) devaddrs[i]); else if (!cdata[i].present) free ((void *) (uintptr_t) devaddrs[i]); diff --git a/libgomp/testsuite/libgomp.fortran/reverse-offload-6.f90 b/libgomp/testsuite/libgomp.fortran/reverse-offload-6.f90 new file mode 100644 index 00000000000..04866edbba7 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/reverse-offload-6.f90 @@ -0,0 +1,32 @@ +! +! Ensure that a mapping with no argument works +! + +module m + implicit none (type, external) + integer :: x = 32 + integer :: dev_num2 = -1 +contains +subroutine foo() + use omp_lib, only: omp_get_device_num + x = x + 10 + dev_num2 = omp_get_device_num() +end +end module m + +use m +use omp_lib +!$omp requires reverse_offload +implicit none (type, external) +integer :: dev_num = -1 +!$omp target map(from:dev_num) + dev_num = omp_get_device_num() + ! This calls GOMP_target_ext with number of maps = 0 + !$omp target device(ancestor:1) + call foo + !$omp end target +!$omp end target + +if (omp_get_num_devices() > 0 .and. dev_num2 == dev_num) stop 1 +if (x /= 42) stop 2 +end