https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119371
--- Comment #2 from Tobias Burnus <burnus at gcc dot gnu.org> ---
BTW: It seems as if none of the testcases in libgomp actually
calls expand_GOMP_SIMT_XCHG_IDX!
* * *
The expansion happens in internal-fn.cc's
static void
expand_GOMP_SIMT_XCHG_IDX (internal_fn, gcall *stmt)
{
tree lhs = gimple_call_lhs (stmt);
if (!lhs)
return;
rtx target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
rtx src = expand_normal (gimple_call_arg (stmt, 0));
rtx idx = expand_normal (gimple_call_arg (stmt, 1));
machine_mode mode = TYPE_MODE (TREE_TYPE (lhs));
class expand_operand ops[3];
create_call_lhs_operand (&ops[0], target, mode);
create_input_operand (&ops[1], src, mode);
create_input_operand (&ops[2], idx, SImode);
gcc_assert (targetm.have_omp_simt_xchg_idx ());
expand_insn (targetm.code_for_omp_simt_xchg_idx, 3, ops); // <<< ICE here
assign_call_lhs (lhs, target, &ops[0]);
}
where
(gdb) p debug(stmt)
*_20.D.1762 = .GOMP_SIMT_XCHG_IDX (D.1763, _30);
(gdb) p debug_rtx (target)
(mem:BLK (reg/f:DI 25 [ _20 ]) [1 *_20.D.1762+0 S4 A32])
(gdb) p debug(idx)
(reg:SI 31 [ _30 ])
(gdb) p debug_rtx (src)
(mem/c:BLK (reg/f:DI 17 virtual-stack-vars) [1 D.1763+0 S4 A128])
645 machine_mode mode = TYPE_MODE (TREE_TYPE (lhs));
(gdb) p mode
$9 = E_BLKmode
And, recall (comment 0) that BLKmode causes problems:
4636 gcc_assert (mode != BLKmode
4637 && (GET_MODE (y) == mode || GET_MODE (y) == VOIDmode));
* * *
BTW: nvptx.md then has:
;; Implement IFN_GOMP_SIMT_XCHG_IDX: broadcast value in operand 1
;; from lane given by index in operand 2 to operand 0 in all lanes
(define_expand "omp_simt_xchg_idx"
[(match_operand 0 "nvptx_register_or_complex_di_df_register_operand" "=R")
(match_operand 1 "nvptx_register_or_complex_di_df_register_operand" "R")
(match_operand:SI 2 "nvptx_nonmemory_operand" "Ri")]
""
{
emit_insn (nvptx_gen_shuffle (operands[0], operands[1], operands[2],
SHUFFLE_IDX));