https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104952

--- Comment #11 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tom de Vries <vr...@gcc.gnu.org>:

https://gcc.gnu.org/g:093cdadbce30ce2d36846a05d979b8afc2eff618

commit r12-7702-g093cdadbce30ce2d36846a05d979b8afc2eff618
Author: Tom de Vries <tdevr...@suse.de>
Date:   Thu Mar 17 14:37:28 2022 +0100

    [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  <tdevr...@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  <tdevr...@suse.de>

            PR target/104952
            * testsuite/libgomp.c/pr104952-1.c: New test.
            * testsuite/libgomp.c/pr104952-2.c: New test.

Reply via email to