Some target like RISC-V allow to group vector register as a whole, and only operate part of it in fact, but the 'init-regs' pass will add initialization for uninitialized registers. Add this hook to reject this action for reducing instruction.
gcc/ * init-regs.c (initialize_uninitialized_regs): Call register_reject_init_p. * target.def (register_reject_init_p): New hook. * doc/tm.texi.in: Add TARGET_REGISTER_REJECT_INIT_P. * doc/tm.texi: Regenerated. --- gcc/doc/tm.texi | 6 ++++++ gcc/doc/tm.texi.in | 2 ++ gcc/init-regs.c | 5 +++++ gcc/target.def | 8 ++++++++ 4 files changed, 21 insertions(+) diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index a30fdcbbf3d6..83fd5496ca3f 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -12588,3 +12588,9 @@ Return an RTX representing @var{tagged_pointer} with its tag set to zero. Store the result in @var{target} if convenient. The default clears the top byte of the original pointer. @end deftypefn + +@deftypefn {Target Hook} bool TARGET_REGISTER_REJECT_INIT_P (rtx @var{reg}) +This target hook should return @code{true} if reject initialization for a uninitialized @var{reg}. + +The default value of this hook is @code{NULL}. +@end deftypefn diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 611fc500ac86..13174ce66d59 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -8180,3 +8180,5 @@ maintainer is familiar with. @hook TARGET_MEMTAG_EXTRACT_TAG @hook TARGET_MEMTAG_UNTAGGED_POINTER + +@hook TARGET_REGISTER_REJECT_INIT_P diff --git a/gcc/init-regs.c b/gcc/init-regs.c index 72e898f3e334..51c0d669d30b 100644 --- a/gcc/init-regs.c +++ b/gcc/init-regs.c @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "backend.h" +#include "target.h" #include "rtl.h" #include "tree.h" #include "df.h" @@ -101,6 +102,10 @@ initialize_uninitialized_regs (void) rtx_insn *move_insn; rtx reg = DF_REF_REAL_REG (use); + if (targetm.register_reject_init_p + && targetm.register_reject_init_p (reg)) + continue; + bitmap_set_bit (already_genned, regno); start_sequence (); diff --git a/gcc/target.def b/gcc/target.def index 7676d5e626e3..c2b54421618d 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4545,6 +4545,14 @@ by a subtarget.", unsigned HOST_WIDE_INT, (void), NULL) +/* Return true if reject initialization for a uninitialized register. */ +DEFHOOK +(register_reject_init_p, + "This target hook should return @code{true} if reject initialization for a uninitialized @var{reg}.\n\ +\n\ +The default value of this hook is @code{NULL}.", + bool, (rtx reg), NULL) + /* Functions relating to calls - argument passing, returns, etc. */ /* Members of struct call have no special macro prefix. */ HOOK_VECTOR (TARGET_CALLS, calls) -- 2.24.3 (Apple Git-128)