On Wed, May 14, 2025 at 2:12 PM Hongtao Liu <[email protected]> wrote:
>
> On Fri, Apr 18, 2025 at 7:10 PM H.J. Lu <[email protected]> wrote:
> >
> > 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
> Could you split preserve_none into a separate patch,
> It looks like it's different from clang's preserve_none[1], can we
> make them align?
> [1] https://clang.llvm.org/docs/AttributeReference.html
>
> > used for integer parameter passing. This can be used in an interpreter
> > to avoid saving/restoring the registers in functions which processing
> > 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_preserve_none_attribute_p instead of looking up
> > no_callee_saved_registers attribute.
> > * config/i386/i386-options.cc (ix86_set_func_type): Call
> > ix86_type_preserve_none_attribute_p instead of looking up
> > no_callee_saved_registers attribute. Check preserve_none
> > attribute for interrupt attribute. Don't check
> > no_caller_saved_registers and no_callee_saved_registers conflicts
> > here.
> > (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_preserve_none_attribute_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_preserve_none_attribute_p): New.
> > (ix86_function_ok_for_sibcall): Call
> > ix86_type_preserve_none_attribute_p instead of looking up
> > no_callee_saved_registers attribute.
> > (ix86_comp_type_attributes): Call
> > ix86_type_preserve_none_attribute_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): If preserve_none calling convention
> > is used, use x86_64_preserve_none_int_parameter_registers.
> > (ix86_call_abi_override): Also set the preserve_none_abi field.
> > (init_cumulative_args): Likewise.
> > (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_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): Update comments for
> > TYPE_NO_CALLEE_SAVED_REGISTERS.
> > (machine_function): Add preserve_none_abi.
> > * doc/extend.texi: Add preserve_none attribute. Update
> > no_caller_saved_registers attribute to remove -mgeneral-regs-only
> > restriction.
> >
...
> > diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> > index 8507243d726..3b5c9520ddf 100644
> > --- a/gcc/config/i386/i386.h
> > +++ b/gcc/config/i386/i386.h
> > @@ -1682,6 +1682,8 @@ typedef struct ix86_args {
> > int stdarg; /* Set to 1 if function is stdarg. */
> > enum calling_abi call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise
> > MS_ABI for ms abi. */
> > + bool preserve_none_abi; /* Set to true if the preserve_none ABI is
> > + used. */
> > tree decl; /* Callee decl. */
> > } CUMULATIVE_ARGS;
> >
> > @@ -2782,7 +2784,7 @@ enum call_saved_registers_type
> > or "no_caller_saved_registers" attribute. */
> > TYPE_NO_CALLER_SAVED_REGISTERS,
> > /* The current function is a function specified with the
> > - "no_callee_saved_registers" attribute. */
> > + "no_callee_saved_registers"/"preserve_none" attribute. */
> > TYPE_NO_CALLEE_SAVED_REGISTERS,
> Can we introduce a new member TYPE_PRESERVE_NONE instead of combining
> it with TYPE_NO_CALLEE_SAVED_REGISTERS.
> TYPE_PRESERVE_{MOST, ALL} can also be introduced if we want, and they
> should conflict with each other.(preserve_none should conflict
> no_callee_saved_registers)
Fixed in the v2 patch:
https://gcc.gnu.org/pipermail/gcc-patches/2025-May/684572.html
> > /* The current function is a function specified with the "noreturn"
> > attribute. */
> > @@ -2816,6 +2818,9 @@ struct GTY(()) machine_function {
> > to be used. MS_ABI means ms abi. Otherwise SYSV_ABI means sysv abi.
> > */
> > ENUM_BITFIELD(calling_abi) call_abi : 8;
> >
> > + /* True if the preserve_none ABI is used. */
> > + BOOL_BITFIELD preserve_none_abi : 1;
> > +
> > /* Nonzero if the function accesses a previous frame. */
> > BOOL_BITFIELD accesses_prev_frame : 1;
> >
> > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> > index 0978c4c41b2..4be531bb4fc 100644
> > --- a/gcc/doc/extend.texi
> > +++ b/gcc/doc/extend.texi
> > @@ -6117,6 +6117,13 @@ registers. For example, this attribute can be used
> > for a function
> > called from the interrupt handler assembly stub which will preserve
> > all registers and return from interrupt.
> >
> > +@cindex @code{preserve_none} function attribute, x86
> > +@item preserve_none
> > +This attribute is similar to @code{no_callee_saved_registers}, except
> > +on x86-64, r12, r13, r14, r15, rdi and rsi registers are used for
> > +integer parameter passing and this calling convention is subject to
> > +change.
> > +
> > @cindex @code{no_caller_saved_registers} function attribute, x86
> > @item no_caller_saved_registers
> > Use this attribute to indicate that the specified function has no
> > @@ -6124,9 +6131,10 @@ caller-saved registers. That is, all registers are
> > callee-saved. For
> > example, this attribute can be used for a function called from an
> > interrupt handler. The compiler generates proper function entry and
> > exit sequences to save and restore any modified registers, except for
> > -the EFLAGS register. Since GCC doesn't preserve SSE, MMX nor x87
> > -states, the GCC option @option{-mgeneral-regs-only} should be used to
> > -compile functions with @code{no_caller_saved_registers} attribute.
> > +the EFLAGS register. Since GCC doesn't preserve YMM nor ZMM registers,
> > +@code{no_caller_saved_registers} attribute can't be used on functions
> > +with AVX enabled. Note that MMX and x87 registers aren't preserved by
> > +@code{no_caller_saved_registers} attribute.
> >
> > @cindex @code{interrupt} function attribute, x86
> > @item interrupt
--
H.J.