On Mon, May 4, 2020 at 9:01 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> Add -mzero-caller-saved-regs=[skip|used-gpr|all-gpr|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 registers upon function return.
>
> 2. -mzero-caller-saved-regs=used-gpr and zero_caller_saved_regs("used-gpr")
>
> Zero used caller-saved integer registers upon function return.
>
> 3. -mzero-caller-saved-regs=all-gpr and zero_caller_saved_regs("all-gpr")
>
> 2. -mzero-caller-saved-regs=used and zero_caller_saved_regs("used")
>
> Zero used caller-saved integer and vector registers upon function return.
>
> 3. -mzero-caller-saved-regs=all and zero_caller_saved_regs("all")
>
> Zero all caller-saved integer and vector registers upon function return.
>
> Tested on i686 and x86-64 with bootstrapping GCC trunk, making
> -mzero-caller-saved-regs=used-gpr, -mzero-caller-saved-regs=all-gpr
> -mzero-caller-saved-regs=used, and -mzero-caller-saved-regs=all enabled
> by default.

This patch should be completely rewritten to use regsets infrastructure.

Please note accessible_reg_set global variable that nowadays holds all
ABI-dependent active registers.

To ease the review, the patch should be split to at least options
part, attribute part, infrastructure part and insn pattern change
part, not to mention separate testsuite part.

Please also get global reviewer on board. This *IS* a new
functionality, even if for some reason lives in i386 directory, so it
requires global functionality review, community consensus, etc...
*BEFORE* target maintainer reviews the patch from the implementation
point of view. Asking for a target review at this time is just putting
the cart before the horse and will get you nowhere.

Uros.

> gcc/
>
>         * i386-expand.c (ix86_find_live_outgoing_regs): New function.
>         (ix86_split_simple_return_pop_internal): Removed.
>         (ix86_split_simple_return_internal): New function.
>         * config/i386/i386-options.c (ix86_set_zero_caller_saved_regs_type):
>         New function.
>         (ix86_set_current_function): Call 
> ix86_set_zero_caller_saved_regs_type.
>         (ix86_handle_fndecl_attribute): Support zero_caller_saved_regs
>         attribute.
>         (ix86_attribute_table): Add zero_caller_saved_regs.
>         * 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_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.
>         * config/i386/i386.h (machine_function): Add
>         zero_caller_saved_regs_type, live_outgoing_int_regs and
>         live_outgoing_vector_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.
>         * gcc.target/i386/zero-scratch-regs-13.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-14.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-15.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-16.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-17.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-18.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-19.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-20.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-21.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-22.c: Likewise.
>         * gcc.target/i386/zero-scratch-regs-23.c: Likewise.

Reply via email to