RFC: [PATCH] x86: Add -mzero-caller-saved-regs=[skip|used|all]

H.J. Lu hjl.tools@gmail.com
Thu Sep 27 13:08:00 GMT 2018


On Thu, Sep 27, 2018 at 3:52 AM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Wed, Sep 26, 2018 at 8:11 PM H.J. Lu <hongjiu.lu@intel.com> wrote:
>>
>> Add -mzero-caller-saved-regs=[skip|used|all] command-line option and
>> zero_caller_saved_regs("skip|used|all") function attribue:
>>
>> 1. -mzero-caller-saved-regs=skip and zero_caller_saved_regs("skip")
>>
>> Don't zero caller-saved integer registers upon function return.
>>
>> 2. -mzero-caller-saved-regs=used and zero_caller_saved_regs("used")
>>
>> Zero used caller-saved integer registers upon function return.
>>
>> 3. -mzero-caller-saved-regs=all and zero_caller_saved_regs("all")
>>
>> Zero all caller-saved integer registers upon function return.
>>
>> Tested on i686 and x86-64 with bootstrapping GCC trunk and
>> -mzero-caller-saved-regs=used as well as -mzero-caller-saved-regs=all
>> enabled by default.
>
> Can this be done in a target independet way?

Find out the live outgoing integer registers can be done in a target
independent way.  But zeroing caller-saved registers should be done
when epilogue is generated, which is target dependent.

> Richard.
>
>> gcc/
>>
>>         * config/i386/i386-opts.h (zero_caller_saved_regs): New enum.
>>         * config/i386/i386-protos.h (ix86_split_simple_return_pop_internal):
>>         Renamed to ...
>>         (ix86_split_simple_return_internal): This.
>>         * config/i386/i386.c (ix86_set_zero_caller_saved_regs_type): New
>>         function.
>>         (ix86_set_current_function): Call ix86_set_zero_caller_saved_regs_type.
>>         (ix86_expand_prologue): Replace gen_prologue_use with
>>         gen_pro_epilogue_use.
>>         (ix86_expand_epilogue): Replace gen_simple_return_pop_internal
>>         with ix86_split_simple_return_internal.  Replace
>>         gen_simple_return_internal with ix86_split_simple_return_internal.
>>         (ix86_find_live_outgoing_regs): New function.
>>         (ix86_split_simple_return_pop_internal): Removed.
>>         (ix86_split_simple_return_internal): New function.
>>         (ix86_handle_fndecl_attribute): Support zero_caller_saved_regs
>>         attribute.
>>         (ix86_attribute_table): Add zero_caller_saved_regs.
>>         * config/i386/i386.h (machine_function): Add
>>         zero_caller_saved_regs_type and live_outgoing_regs.
>>         (TARGET_POP_SCRATCH_REGISTER): New.
>>         * config/i386/i386.md (UNSPEC_SIMPLE_RETURN): New UNSPEC.
>>         (UNSPECV_PROLOGUE_USE): Renamed to ...
>>         (UNSPECV_PRO_EPILOGUE_USE): This.
>>         (prologue_use): Renamed to ...
>>         (pro_epilogue_use): This.
>>         (simple_return_internal): Changed to define_insn_and_split.
>>         (simple_return_internal_1): New pattern.
>>         (simple_return_pop_internal): Replace
>>         ix86_split_simple_return_pop_internal with
>>         ix86_split_simple_return_internal.  Always call
>>         ix86_split_simple_return_internal if epilogue_completed is
>>         true.
>>         (simple_return_pop_internal_1): New pattern.
>>         (Epilogue deallocator to pop peepholes): Enabled only if
>>         TARGET_POP_SCRATCH_REGISTER is true.
>>         * config/i386/i386.opt (mzero-caller-saved-regs=): New option.
>>         * doc/extend.texi: Document zero_caller_saved_regs attribute.
>>         * doc/invoke.texi: Document -mzero-caller-saved-regs=.
>>
>> gcc/testsuite/
>>
>>         * gcc.target/i386/zero-scratch-regs-1.c: New test.
>>         * gcc.target/i386/zero-scratch-regs-2.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-3.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-4.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-5.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-6.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-7.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-8.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-9.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-10.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-11.c: Likewise.
>>         * gcc.target/i386/zero-scratch-regs-12.c: Likewise.



-- 
H.J.



More information about the Gcc-patches mailing list