[nvptx] Handle DCmode in define_expand "omp_simt_xchg_{bfly,idx}"
authorTom de Vries <tdevries@suse.de>
Mon, 28 Feb 2022 15:06:54 +0000 (16:06 +0100)
committerTom de Vries <tdevries@suse.de>
Tue, 1 Mar 2022 07:58:36 +0000 (08:58 +0100)
commitc2e0d0c1cfb4bf29daed189b39885841ee201a65
tree375166c8b615804bbd4723656f2339f5058c8c49
parentd59d13c89503baf92d14b04c05708a6296916fad
[nvptx] Handle DCmode in define_expand "omp_simt_xchg_{bfly,idx}"

For a test-case doing an openmp target simd reduction on a complex double:
...
  DOUBLE COMPLEX :: counter_N0
  ...
  !$OMP TARGET SIMD reduction(+: counter_N0)
...
we run into:
...
during RTL pass: expand
b.f90: In function ‘MAIN__._omp_fn.0’:
b.f90:23:32: internal compiler error: in expand_insn, at optabs.cc:8029
   23 |     counter_N0 = counter_N0 + 1.
      |                                ^
0x10f1cd3 expand_insn(insn_code, unsigned int, expand_operand*)
        gcc/optabs.cc:8029
0xeac435 expand_GOMP_SIMT_XCHG_BFLY
        gcc/internal-fn.cc:375
...

Fix this by handling DCmode and CDImode in define_expand
"omp_simt_xchg_{bfly,idx}".

Tested on x86_64 with nvptx accelerator.

gcc/ChangeLog:

2022-02-28  Tom de Vries  <tdevries@suse.de>

PR target/102429
* config/nvptx/nvptx.cc (nvptx_gen_shuffle): Handle DCmode and CDImode.
* config/nvptx/nvptx.md
(define_predicate "nvptx_register_or_complex_di_df_register_operand"):
New predicate.
(define_expand "omp_simt_xchg_bfly", define_expand "omp_simt_xchg_idx"):
Use nvptx_register_or_complex_di_df_register_operand.
gcc/config/nvptx/nvptx.cc
gcc/config/nvptx/nvptx.md