diff mbox series

[1/2] target hooks: allow post processing after epilogue inserted.

Message ID 20240605015024.7845-2-gaofei@eswincomputing.com
State New
Headers show
Series fix RISC-V zcmp popretz [PR113715] | expand

Commit Message

Fei Gao June 5, 2024, 1:50 a.m. UTC
Define TARGET_POST_EPILOGUE_PROC if you have additional processing
after epilogue is inserted into a basic block.

gcc/ChangeLog:

        * doc/tm.texi: Regenerate.
        * doc/tm.texi.in: Document TARGET_POST_EPILOGUE_PROC.
        * function.cc (thread_prologue_and_epilogue_insns): Allow 
        targets to have additional processingafter epilogue is
        inserted into a basic block.
        * hooks.cc (hook_void_rtx_insn): Define default handler.
        * hooks.h (hook_void_rtx_insn): Declare.
        * target.def: New hook.

Signed-off-by: Fei Gao <gaofei@eswincomputing.com>
---
 gcc/doc/tm.texi    | 5 +++++
 gcc/doc/tm.texi.in | 2 ++
 gcc/function.cc    | 2 ++
 gcc/hooks.cc       | 7 +++++++
 gcc/hooks.h        | 1 +
 gcc/target.def     | 8 ++++++++
 6 files changed, 25 insertions(+)
diff mbox series

Patch

diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index cd50078227d..666a08c0406 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -5299,6 +5299,11 @@  This hook should add additional registers that are computed by the prologue
 to the hard regset for shrink-wrapping optimization purposes.
 @end deftypefn
 
+@deftypefn {Target Hook} void TARGET_POST_EPILOGUE_PROC (rtx_insn *@var{})
+Define this hook if you have additional processing after epilogue is
+inserted into a basic block.
+@end deftypefn
+
 @deftypefn {Target Hook} bool TARGET_WARN_FUNC_RETURN (tree)
 True if a function's return statements should be checked for matching
 the function's return type.  This includes checking for falling off the end
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 058bd56487a..218e5d9dc20 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -3754,6 +3754,8 @@  the function prologue.  Normally, the profiling code comes after.
 
 @hook TARGET_SET_UP_BY_PROLOGUE
 
+@hook TARGET_POST_EPILOGUE_PROC
+
 @hook TARGET_WARN_FUNC_RETURN
 
 @node Shrink-wrapping separate components
diff --git a/gcc/function.cc b/gcc/function.cc
index 4edd4da1247..6f3027972ee 100644
--- a/gcc/function.cc
+++ b/gcc/function.cc
@@ -6258,6 +6258,8 @@  thread_prologue_and_epilogue_insns (void)
 	}
     }
 
+  targetm.post_epilogue_proc (epilogue_seq);
+
   /* Threading the prologue and epilogue changes the artificial refs in the
      entry and exit blocks, and may invalidate DF info for tail calls.  */
   if (optimize
diff --git a/gcc/hooks.cc b/gcc/hooks.cc
index 28769074222..40844dd3593 100644
--- a/gcc/hooks.cc
+++ b/gcc/hooks.cc
@@ -501,6 +501,13 @@  hook_bool_rtx_insn_int_false (rtx_insn *, int)
   return false;
 }
 
+/* Generic hook that takes a rtx_insn * and returns void.  */
+
+void
+hook_void_rtx_insn (rtx_insn *)
+{
+}
+
 /* Generic hook that takes a rtx_insn * and an int and returns void.  */
 
 void
diff --git a/gcc/hooks.h b/gcc/hooks.h
index 924748420e6..4b2f47c61c1 100644
--- a/gcc/hooks.h
+++ b/gcc/hooks.h
@@ -60,6 +60,7 @@  extern bool hook_bool_const_tree_hwi_hwi_const_tree_true (const_tree,
 extern bool hook_bool_rtx_insn_true (rtx_insn *);
 extern bool hook_bool_rtx_false (rtx);
 extern bool hook_bool_rtx_insn_int_false (rtx_insn *, int);
+extern void hook_void_rtx_insn (rtx_insn *);
 extern bool hook_bool_uintp_uintp_false (unsigned int *, unsigned int *);
 extern bool hook_bool_reg_class_t_false (reg_class_t regclass);
 extern bool hook_bool_mode_mode_reg_class_t_true (machine_mode, machine_mode,
diff --git a/gcc/target.def b/gcc/target.def
index c27df8095be..cd23f569e0b 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -6840,6 +6840,14 @@  to the hard regset for shrink-wrapping optimization purposes.",
  void, (struct hard_reg_set_container *),
  NULL)
 
+/* Post epilogue processing.  */
+DEFHOOK
+(post_epilogue_proc,
+ "Define this hook if you have additional processing after epilogue is\n\
+inserted into a basic block.",
+ void, (rtx_insn *),
+ hook_void_rtx_insn)
+
 /* For targets that have attributes that can affect whether a
    function's return statements need checking.  For instance a 'naked'
    function attribute.  */