]> git.ipfire.org Git - thirdparty/gcc.git/commit
x86: Add preserve_none and update no_caller_saved_registers attributes
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 13 Apr 2025 18:38:24 +0000 (11:38 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 26 Jun 2025 04:55:03 +0000 (12:55 +0800)
commit9804b23198b39f85a7258be556c5e8aed44b9efc
tree5b5533dda38548432ac5fd8697d0ccbcb2d1b2a3
parent407ae3aa7901509cc2d3140c3311c105d31fc0f4
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 <hjl.tools@gmail.com>
43 files changed:
gcc/config/i386/i386-expand.cc
gcc/config/i386/i386-options.cc
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.cc
gcc/config/i386/i386.h
gcc/doc/extend.texi
gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/no-callee-saved-19b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/no-callee-saved-19e.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/no-callee-saved-3.c
gcc/testsuite/gcc.target/i386/preserve-none-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-15.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-17.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-18.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-19.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-20.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-21.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-22.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-23.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-24.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-25.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-26.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-27.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-28.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-29.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-30a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-30b.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/preserve-none-9.c [new file with mode: 0644]