[openmp] Fix SIMT reduction using TRUTH_{AND,OR}IF_EXPR
authorTom de Vries <tdevries@suse.de>
Thu, 17 Mar 2022 13:37:28 +0000 (14:37 +0100)
committerTom de Vries <tdevries@suse.de>
Fri, 18 Mar 2022 14:45:13 +0000 (15:45 +0100)
commit093cdadbce30ce2d36846a05d979b8afc2eff618
tree0c7e552417ad83f581717d24b57735a03fbb3c0a
parent6393122d271a92d5d9d8656a57ea167e92498871
[openmp] Fix SIMT reduction using TRUTH_{AND,OR}IF_EXPR

Consider test-case pr104952-1.c, included in this commit, containing:
...
  #pragma omp target map(tofrom:result) map(to:arr)
  #pragma omp simd reduction(||: result)
...

When run on x86_64 with nvptx accelerator, the test-case either aborts or
hangs.

The reduction clause is translated by the SIMT code (active for nvptx) as a
butterfly reduction loop with this butterfly shuffle / update pair:
...
  D.2163 = D.2163 || .GOMP_SIMT_XCHG_BFLY (D.2163, D.2164)
...
in the loop body.

The problem is that the butterfly shuffle is possibly not executed, while it
needs to be executed unconditionally.

Fix this by translating instead as:
...
  D.tmp_bfly = .GOMP_SIMT_XCHG_BFLY (D.2163, D.2164)
  D.2163 = D.2163 || D.tmp_bfly
...

Tested on x86_64-linux with nvptx accelerator.

gcc/ChangeLog:

2022-03-17  Tom de Vries  <tdevries@suse.de>

PR target/104952
* omp-low.cc (lower_rec_input_clauses): Make sure GOMP_SIMT_XCHG_BFLY
is executed unconditionally.

libgomp/ChangeLog:

2022-03-17  Tom de Vries  <tdevries@suse.de>

PR target/104952
* testsuite/libgomp.c/pr104952-1.c: New test.
* testsuite/libgomp.c/pr104952-2.c: New test.
gcc/omp-low.cc
libgomp/testsuite/libgomp.c/pr104952-1.c [new file with mode: 0644]
libgomp/testsuite/libgomp.c/pr104952-2.c [new file with mode: 0644]