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

--- Comment #17 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by H.J. Lu <[email protected]>:

https://gcc.gnu.org/g:9804b23198b39f85a7258be556c5e8aed44b9efc

commit r16-1692-g9804b23198b39f85a7258be556c5e8aed44b9efc
Author: H.J. Lu <[email protected]>
Date:   Sun Apr 13 11:38:24 2025 -0700

    x86: Add preserve_none and update no_caller_saved_registers attributes

    Add preserve_none attribute which is similar to no_callee_saved_registers
    attribute, except on x86-64, r12, r13, r14, r15, rdi and rsi registers are
    used for integer parameter passing.  This can be used in an interpreter
    to avoid saving/restoring the registers in functions which process byte
    codes.  It improved the pystones benchmark by 6-7%:

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119628#c15

    Remove -mgeneral-regs-only restriction on no_caller_saved_registers
    attribute.  Only SSE is allowed since SSE XMM register load preserves
    the upper bits in YMM/ZMM register while YMM register load zeros the
    upper 256 bits of ZMM register, and preserving 32 ZMM registers can
    be quite expensive.

    gcc/

            PR target/119628
            * config/i386/i386-expand.cc (ix86_expand_call): Call
            ix86_type_no_callee_saved_registers_p instead of looking up
            no_callee_saved_registers attribute.
            * config/i386/i386-options.cc (ix86_set_func_type): Look up
            preserve_none attribute.  Check preserve_none attribute for
            interrupt attribute.  Don't check no_caller_saved_registers nor
            no_callee_saved_registers conflicts here.
            (ix86_set_func_type): Check no_callee_saved_registers before
            checking no_caller_saved_registers attribute.
            (ix86_set_current_function): Allow SSE with
            no_caller_saved_registers attribute.
            (ix86_handle_call_saved_registers_attribute): Check preserve_none,
            no_callee_saved_registers and no_caller_saved_registers conflicts.
            (ix86_gnu_attributes): Add preserve_none attribute.
            * config/i386/i386-protos.h
(ix86_type_no_callee_saved_registers_p):
            New.
            * config/i386/i386.cc
            (x86_64_preserve_none_int_parameter_registers): New.
            (ix86_using_red_zone): Don't use red-zone when there are no
            caller-saved registers with SSE.
            (ix86_type_no_callee_saved_registers_p): New.
            (ix86_function_ok_for_sibcall): Also check TYPE_PRESERVE_NONE
            and call ix86_type_no_callee_saved_registers_p instead of looking
            up no_callee_saved_registers attribute.
            (ix86_comp_type_attributes): Call
            ix86_type_no_callee_saved_registers_p instead of looking up
            no_callee_saved_registers attribute.  Return 0 if preserve_none
            attribute doesn't match in 64-bit mode.
            (ix86_function_arg_regno_p): For cfun with TYPE_PRESERVE_NONE,
            use x86_64_preserve_none_int_parameter_registers.
            (init_cumulative_args): Set preserve_none_abi.
            (function_arg_64): Use x86_64_preserve_none_int_parameter_registers
            with preserve_none attribute.
            (setup_incoming_varargs_64): Use
            x86_64_preserve_none_int_parameter_registers with preserve_none
            attribute.
            (ix86_save_reg): Treat TYPE_PRESERVE_NONE like
            TYPE_NO_CALLEE_SAVED_REGISTERS.
            (ix86_nsaved_sseregs): Allow saving XMM registers for
            no_caller_saved_registers attribute.
            (ix86_compute_frame_layout): Likewise.
            (x86_this_parameter): Use
            x86_64_preserve_none_int_parameter_registers with preserve_none
            attribute.
            * config/i386/i386.h (ix86_args): Add preserve_none_abi.
            (call_saved_registers_type): Add TYPE_PRESERVE_NONE.
            (machine_function): Change call_saved_registers to 3 bits.
            * doc/extend.texi: Add preserve_none attribute.  Update
            no_caller_saved_registers attribute to remove -mgeneral-regs-only
            restriction.

    gcc/testsuite/

            PR target/119628
            * gcc.target/i386/no-callee-saved-3.c: Adjust error location.
            * gcc.target/i386/no-callee-saved-19a.c: New test.
            * gcc.target/i386/no-callee-saved-19b.c: Likewise.
            * gcc.target/i386/no-callee-saved-19c.c: Likewise.
            * gcc.target/i386/no-callee-saved-19d.c: Likewise.
            * gcc.target/i386/no-callee-saved-19e.c: Likewise.
            * gcc.target/i386/preserve-none-1.c: Likewise.
            * gcc.target/i386/preserve-none-2.c: Likewise.
            * gcc.target/i386/preserve-none-3.c: Likewise.
            * gcc.target/i386/preserve-none-4.c: Likewise.
            * gcc.target/i386/preserve-none-5.c: Likewise.
            * gcc.target/i386/preserve-none-6.c: Likewise.
            * gcc.target/i386/preserve-none-7.c: Likewise.
            * gcc.target/i386/preserve-none-8.c: Likewise.
            * gcc.target/i386/preserve-none-9.c: Likewise.
            * gcc.target/i386/preserve-none-10.c: Likewise.
            * gcc.target/i386/preserve-none-11.c: Likewise.
            * gcc.target/i386/preserve-none-12.c: Likewise.
            * gcc.target/i386/preserve-none-13.c: Likewise.
            * gcc.target/i386/preserve-none-14.c: Likewise.
            * gcc.target/i386/preserve-none-15.c: Likewise.
            * gcc.target/i386/preserve-none-16.c: Likewise.
            * gcc.target/i386/preserve-none-17.c: Likewise.
            * gcc.target/i386/preserve-none-18.c: Likewise.
            * gcc.target/i386/preserve-none-19.c: Likewise.
            * gcc.target/i386/preserve-none-20.c: Likewise.
            * gcc.target/i386/preserve-none-21.c: Likewise.
            * gcc.target/i386/preserve-none-22.c: Likewise.
            * gcc.target/i386/preserve-none-23.c: Likewise.
            * gcc.target/i386/preserve-none-24.c: Likewise.
            * gcc.target/i386/preserve-none-25.c: Likewise.
            * gcc.target/i386/preserve-none-26.c: Likewise.
            * gcc.target/i386/preserve-none-27.c: Likewise.
            * gcc.target/i386/preserve-none-28.c: Likewise.
            * gcc.target/i386/preserve-none-29.c: Likewise.
            * gcc.target/i386/preserve-none-30a.c: Likewise.
            * gcc.target/i386/preserve-none-30b.c: Likewise.

    Signed-off-by: H.J. Lu <[email protected]>

Reply via email to