aboutsummaryrefslogtreecommitdiff
path: root/libgomp
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-09-05 12:45:07 +0200
committerTom de Vries <tdevries@suse.de>2020-09-14 08:28:56 +0200
commit4ac7b66958016225724084078e6e7937e23ffcd3 (patch)
tree47204c1ed494cf156f9f786f4956c587199e487b /libgomp
parent919858077f4b768c8472f29b977edf0aa6e0f1e5 (diff)
downloadgcc-4ac7b66958016225724084078e6e7937e23ffcd3.zip
gcc-4ac7b66958016225724084078e6e7937e23ffcd3.tar.gz
gcc-4ac7b66958016225724084078e6e7937e23ffcd3.tar.bz2
[libgomp, nvptx] Add __sync_compare_and_swap_16
As reported here ( https://gcc.gnu.org/pipermail/gcc-patches/2020-September/553070.html ), when running test-case libgomp.c-c++-common/reduction-16.c for powerpc host with nvptx accelerator, we run into: ... unresolved symbol __sync_val_compare_and_swap_16 ... I can reproduce the problem on x86_64 with a trigger patch that: - initializes ix86_isa_flags2 to TARGET_ISA2_CX16 - enables define_expand "atomic_load<mode>" in gcc/config/i386/sync.md for TImode The problem is that omp-expand.c generates atomic builtin calls based on checks whether those are supported on the host, which forces the target to support these, even though those checks fail for the accelerator target. Fix this by: - adding a __sync_val_compare_and_swap_16 in libgomp for nvptx, which falls back onto libatomic's __atomic_compare_and_swap_16 - adding -foffload=-latomic in the test-case Tested libgomp on x86_64-linux with nvptx accelerator. Tested libgomp with trigger patch on x86_64-linux with nvptx accelerator. libgomp/ChangeLog: * config/nvptx/atomic.c: New file. Add __sync_val_compare_and_swap_16. * testsuite/libgomp.c-c++-common/reduction-16.c: Add -latomic for target offload_target_nvptx.
Diffstat (limited to 'libgomp')
-rw-r--r--libgomp/config/nvptx/atomic.c18
-rw-r--r--libgomp/testsuite/libgomp.c-c++-common/reduction-16.c1
2 files changed, 19 insertions, 0 deletions
diff --git a/libgomp/config/nvptx/atomic.c b/libgomp/config/nvptx/atomic.c
new file mode 100644
index 0000000..2e13b09
--- /dev/null
+++ b/libgomp/config/nvptx/atomic.c
@@ -0,0 +1,18 @@
+#include "libgomp.h"
+
+#include "../../atomic.c"
+
+/* Implement __sync_val_compare_and_swap_16, to support offloading from hosts
+ that support this builtin. Fallback on libatomic. This can be removed
+ once omp-expand starts using __atomic_compare_exchange_n instead. */
+
+unsigned __int128
+__sync_val_compare_and_swap_16 (volatile void *vptr, unsigned __int128 oldval,
+ unsigned __int128 newval)
+{
+ volatile __int128 *ptr = vptr;
+ __int128 expected = oldval;
+ __atomic_compare_exchange_n (ptr, &expected, newval, false,
+ MEMMODEL_SEQ_CST, MEMMODEL_SEQ_CST);
+ return expected;
+}
diff --git a/libgomp/testsuite/libgomp.c-c++-common/reduction-16.c b/libgomp/testsuite/libgomp.c-c++-common/reduction-16.c
index d0e82b0..e60fe36 100644
--- a/libgomp/testsuite/libgomp.c-c++-common/reduction-16.c
+++ b/libgomp/testsuite/libgomp.c-c++-common/reduction-16.c
@@ -1,4 +1,5 @@
/* { dg-do run } */
+/* { dg-additional-options "-foffload=-latomic" { target offload_target_nvptx } } */
#include <stdlib.h>