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

--- Comment #36 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-15 branch has been updated by Kito Cheng <[email protected]>:

https://gcc.gnu.org/g:0efe904de8ce64e57db4c51e721f798ec3225b02

commit r15-10386-g0efe904de8ce64e57db4c51e721f798ec3225b02
Author: Kito Cheng <[email protected]>
Date:   Thu Jul 10 15:28:30 2025 +0800

    RISC-V: Always register vector built-in functions during LTO [PR110812]

    Previously, vector built-in functions were not properly registered during
    the LTO pipeline, causing link failures when vector intrinsics were used
    in LTO builds with mixed architecture options.  This patch ensures all
    vector built-in functions are always registered during LTO compilation.

    The key changes include:
    - Moving pragma intrinsic flag manipulation from riscv-c.cc to
      riscv-vector-builtins.cc for better encapsulation
    - Registering all vector built-in functions regardless of current ISA
      extensions, deferring the actual extension checking to expansion time
    - Adding proper support for built-in type registration during LTO

    This approach is safe because we already perform extension requirement
    checking at expansion time.  The trade-off is a slight increase in
    bootstrap time for LTO builds due to registering more built-in functions.

            PR target/110812

    gcc/ChangeLog:

            * config/riscv/riscv-c.cc (pragma_intrinsic_flags): Remove struct.
            (riscv_pragma_intrinsic_flags_pollute): Remove function.
            (riscv_pragma_intrinsic_flags_restore): Remove function.
            (riscv_pragma_intrinsic): Simplify to only call
handle_pragma_vector.
            * config/riscv/riscv-vector-builtins.cc (pragma_intrinsic_flags):
            Move struct definition here from riscv-c.cc.
            (riscv_pragma_intrinsic_flags_pollute): Move and adapt from
            riscv-c.cc, add zvfbfmin, zvfhmin and vector_elen_bf_16 support.
            (riscv_pragma_intrinsic_flags_restore): Move from riscv-c.cc.
            (rvv_switcher::rvv_switcher): Add pollute_flags parameter to
            control flag manipulation.
            (rvv_switcher::~rvv_switcher): Restore flags conditionally.
            (register_builtin_types): Use rvv_switcher without polluting flags.
            (get_required_extensions): Remove function.
            (check_required_extensions): Simplify to only check type validity.
            (function_instance::function_returns_void_p): Move implementation
            from header.
            (function_builder::add_function): Register placeholder for LTO.
            (init_builtins): Simplify and handle LTO case.
            (reinit_builtins): Remove function.
            (handle_pragma_vector): Remove extension checking.
            * config/riscv/riscv-vector-builtins.h
            (function_instance::function_returns_void_p): Add declaration.
            (function_call_info::function_returns_void_p): Remove inline
            implementation.

    gcc/testsuite/ChangeLog:

            * gcc.target/riscv/lto/pr110812_0.c: New test.
            * gcc.target/riscv/lto/pr110812_1.c: New test.
            * gcc.target/riscv/lto/riscv-lto.exp: New test driver.
            * gcc.target/riscv/lto/riscv_vector.h: New header wrapper.

Reply via email to