On Thu, Sep 27, 2018 at 3:52 AM, Richard Biener <richard.guent...@gmail.com> wrote: > On Wed, Sep 26, 2018 at 8:11 PM H.J. Lu <hongjiu...@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.