[nvptx] Add some support for .local atomics
authorTom de Vries <tdevries@suse.de>
Fri, 21 Jan 2022 20:46:05 +0000 (21:46 +0100)
committerTom de Vries <tdevries@suse.de>
Tue, 1 Feb 2022 18:28:24 +0000 (19:28 +0100)
commite0451f93d9faa13495132f4e246e9bef30b51417
tree22d002b52a5921f93d4d4e48c82280c3094f1216
parentca902055d056773bd0ca80f68bca4b20ad0e183f
[nvptx] Add some support for .local atomics

The ptx insn atom doesn't support local memory.  In case of doing an atomic
operation on local memory, we run into:
...
operation not supported on global/shared address space
...
This is the cuGetErrorString message for CUDA_ERROR_INVALID_ADDRESS_SPACE.

The message is somewhat confusing given that actually the operation is not
supported on local address space.

Fix this by falling back on a non-atomic version when detecting
a frame-related memory operand.

This only solves some cases that are detected at compile-time.  It does
however fix the openacc private-atomic-* test-cases.

Tested on x86_64 with nvptx accelerator.

gcc/ChangeLog:

2022-01-27  Tom de Vries  <tdevries@suse.de>

* config/nvptx/nvptx.md (define_insn "atomic_compare_and_swap<mode>_1")
(define_insn "atomic_exchange<mode>")
(define_insn "atomic_fetch_add<mode>")
(define_insn "atomic_fetch_addsf")
(define_insn "atomic_fetch_<logic><mode>"): Output non-atomic version
if memory operands is frame-relative.

gcc/testsuite/ChangeLog:

2022-01-31  Tom de Vries  <tdevries@suse.de>

* gcc.target/nvptx/stack-atomics-run.c: New test.

libgomp/ChangeLog:

2022-01-27  Tom de Vries  <tdevries@suse.de>

* testsuite/libgomp.oacc-c-c++-common/private-atomic-1.c: Remove
PR83812 workaround.
* testsuite/libgomp.oacc-fortran/private-atomic-1-vector.f90: Same.
* testsuite/libgomp.oacc-fortran/private-atomic-1-worker.f90: Same.
gcc/config/nvptx/nvptx.md
gcc/testsuite/gcc.target/nvptx/stack-atomics-run.c [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-c-c++-common/private-atomic-1.c
libgomp/testsuite/libgomp.oacc-fortran/private-atomic-1-vector.f90
libgomp/testsuite/libgomp.oacc-fortran/private-atomic-1-worker.f90