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

--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-15 branch has been updated by Thomas Schwinge
<tschwi...@gcc.gnu.org>:

https://gcc.gnu.org/g:7a9b7f81f19c05cdb730c70dd825ba3ab5c30443

commit r15-10041-g7a9b7f81f19c05cdb730c70dd825ba3ab5c30443
Author: Thomas Schwinge <tschwi...@baylibre.com>
Date:   Thu May 15 18:11:16 2025 +0200

    'TYPE_EMPTY_P' vs. code offloading [PR120308]

    We've got 'gcc/stor-layout.cc:finalize_type_size':

        /* Handle empty records as per the x86-64 psABI.  */
        TYPE_EMPTY_P (type) = targetm.calls.empty_record_p (type);

    (Indeed x86_64 is still the only target to define 'TARGET_EMPTY_RECORD_P',
    calling 'gcc/tree.cc-default_is_empty_record'.)

    And so it happens that for an empty struct used in code offloaded from
x86_64
    host (but not powerpc64le host, for example), we get to see 'TYPE_EMPTY_P'
in
    offloading compilation (where the offload targets (currently?) don't use it
    themselves, and therefore aren't prepared to handle it).

    For nvptx offloading compilation, this causes wrong code generation:
    'ptxas [...] error : Call has wrong number of parameters', as nvptx code
    generation for function definition doesn't pay attention to this flag (say,
in
    'gcc/config/nvptx/nvptx.cc:pass_in_memory', or whereever else would be
    appropriate to handle that), but the generic code
'gcc/calls.cc:expand_call'
    via 'gcc/function.cc:aggregate_value_p' does pay attention to it, and we
thus
    get mismatching function definition vs. function call.

    This issue apparently isn't a problem for GCN offloading, but I don't know
if
    that's by design or by accident.

    Richard Biener:
    > It looks like TYPE_EMPTY_P is only used during RTL expansion for ABI
    > purposes, so computing it during layout_type is premature as shown here.
    >
    > I would suggest to simply re-compute it at offload stream-in time.

    (For avoidance of doubt, the additions to
'gcc.target/nvptx/abi-struct-arg.c',
    'gcc.target/nvptx/abi-struct-ret.c' are not dependent on the offload
streaming
    code changes, but are just to mirror the changes to
    'libgomp.oacc-c-c++-common/abi-struct-1.c'.)

            PR lto/120308
            gcc/
            * lto-streamer-out.cc (hash_tree): Don't handle 'TYPE_EMPTY_P' for
            'lto_stream_offload_p'.
            * tree-streamer-in.cc (unpack_ts_type_common_value_fields):
            Likewise.
            * tree-streamer-out.cc (pack_ts_type_common_value_fields):
            Likewise.
            libgomp/
            * testsuite/libgomp.oacc-c-c++-common/abi-struct-1.c: Add empty
            structure testing.
            gcc/testsuite/
            * gcc.target/nvptx/abi-struct-arg.c: Add empty structure testing.
            * gcc.target/nvptx/abi-struct-ret.c: Likewise.

    (cherry picked from commit 9063810c86beee6274d745b91d8fb43a81c9683e)

Reply via email to