diff mbox series

[2/2] xtensa: Prepend "(use A0_REG)" to sibling call CALL_INSN_FUNCTION_USAGE instead of emitting it as insn at the end of epilogue

Message ID 9d37cbb9-501d-4f52-bac9-9ef9d33d6127@yahoo.co.jp
State New
Headers show
Series [1/2] xtensa: Simplify several MD templates | expand

Commit Message

Takayuki 'January June' Suwa May 31, 2024, 10:24 a.m. UTC
No functional changes.

gcc/ChangeLog:

	* config/xtensa/xtensa-protos.h (xtensa_expand_call):
	Add the third argument as boolean.
	(xtensa_expand_epilogue): Remove the first argument.
	* config/xtensa/xtensa.cc (xtensa_expand_call):
	Add the third argument "sibcall_p", and modify in order to prepend
	"(use A0_REG)" to CALL_INSN_FUNCTION_USAGE if the argument is true.
	(xtensa_expand_epilogue): Remove the first argument "sibcall_p" and
	its conditional clause.
	* config/xtensa/xtensa.md (call, call_value, sibcall, sibcall_value):
	Append a boolean value to the argument of xtensa_expand_call()
	indicating whether it is sibling call or not.
	(epilogue): Remove the boolean argument from xtensa_expand_epilogue(),
	and then append emitting "(return)".
	(sibcall_epilogue): Remove the boolean argument from
	xtensa_expand_epilogue().
---
  gcc/config/xtensa/xtensa-protos.h |  4 ++--
  gcc/config/xtensa/xtensa.cc       | 16 ++++++++++------
  gcc/config/xtensa/xtensa.md       | 13 +++++++------
  3 files changed, 19 insertions(+), 14 deletions(-)

Comments

Max Filippov May 31, 2024, 9:46 p.m. UTC | #1
On Fri, May 31, 2024 at 07:24:48PM +0900, Takayuki 'January June' Suwa wrote:
> No functional changes.
> 
> gcc/ChangeLog:
> 
> 	* config/xtensa/xtensa-protos.h (xtensa_expand_call):
> 	Add the third argument as boolean.
> 	(xtensa_expand_epilogue): Remove the first argument.
> 	* config/xtensa/xtensa.cc (xtensa_expand_call):
> 	Add the third argument "sibcall_p", and modify in order to prepend
> 	"(use A0_REG)" to CALL_INSN_FUNCTION_USAGE if the argument is true.
> 	(xtensa_expand_epilogue): Remove the first argument "sibcall_p" and
> 	its conditional clause.
> 	* config/xtensa/xtensa.md (call, call_value, sibcall, sibcall_value):
> 	Append a boolean value to the argument of xtensa_expand_call()
> 	indicating whether it is sibling call or not.
> 	(epilogue): Remove the boolean argument from xtensa_expand_epilogue(),
> 	and then append emitting "(return)".
> 	(sibcall_epilogue): Remove the boolean argument from
> 	xtensa_expand_epilogue().
> ---
>  gcc/config/xtensa/xtensa-protos.h |  4 ++--
>  gcc/config/xtensa/xtensa.cc       | 16 ++++++++++------
>  gcc/config/xtensa/xtensa.md       | 13 +++++++------
>  3 files changed, 19 insertions(+), 14 deletions(-)

Regtested for target=xtensa-linux-uclibc, no new regressions.
Committed to master.
diff mbox series

Patch

diff --git a/gcc/config/xtensa/xtensa-protos.h b/gcc/config/xtensa/xtensa-protos.h
index 834f15e0e48..77553b0453f 100644
--- a/gcc/config/xtensa/xtensa-protos.h
+++ b/gcc/config/xtensa/xtensa-protos.h
@@ -53,7 +53,7 @@  extern void xtensa_expand_atomic (enum rtx_code, rtx, rtx, rtx, bool);
  extern void xtensa_emit_loop_end (rtx_insn *, rtx *);
  extern char *xtensa_emit_branch (bool, rtx *);
  extern char *xtensa_emit_movcc (bool, bool, bool, rtx *);
-extern void xtensa_expand_call (int, rtx *);
+extern void xtensa_expand_call (int, rtx *, bool);
  extern char *xtensa_emit_call (int, rtx *);
  extern char *xtensa_emit_sibcall (int, rtx *);
  extern bool xtensa_tls_referenced_p (rtx);
@@ -76,7 +76,7 @@  extern void xtensa_setup_frame_addresses (void);
  extern int xtensa_debugger_regno (int);
  extern long compute_frame_size (poly_int64);
  extern void xtensa_expand_prologue (void);
-extern void xtensa_expand_epilogue (bool);
+extern void xtensa_expand_epilogue (void);
  extern void xtensa_adjust_reg_alloc_order (void);
  extern enum reg_class xtensa_regno_to_class (int regno);
  extern HOST_WIDE_INT xtensa_initial_elimination_offset (int from, int to);
diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index 301448c65e2..45dc1be3ff5 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -2239,7 +2239,7 @@  xtensa_emit_movcc (bool inverted, bool isfp, bool isbool, rtx *operands)
  
  
  void
-xtensa_expand_call (int callop, rtx *operands)
+xtensa_expand_call (int callop, rtx *operands, bool sibcall_p)
  {
    rtx call;
    rtx_insn *call_insn;
@@ -2281,6 +2281,14 @@  xtensa_expand_call (int callop, rtx *operands)
        CALL_INSN_FUNCTION_USAGE (call_insn) =
  	gen_rtx_EXPR_LIST (Pmode, clob, CALL_INSN_FUNCTION_USAGE (call_insn));
      }
+  else if (sibcall_p)
+    {
+      /* Sibling call requires a return address to the caller, similar to
+	 "return" insn.  */
+      rtx use = gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, A0_REG));
+      CALL_INSN_FUNCTION_USAGE (call_insn) =
+	gen_rtx_EXPR_LIST (Pmode, use, CALL_INSN_FUNCTION_USAGE (call_insn));
+    }
  }
  
  
@@ -3671,7 +3679,7 @@  xtensa_expand_prologue (void)
  }
  
  void
-xtensa_expand_epilogue (bool sibcall_p)
+xtensa_expand_epilogue (void)
  {
    if (!TARGET_WINDOWED_ABI)
      {
@@ -3736,10 +3744,6 @@  xtensa_expand_epilogue (bool sibcall_p)
  				  stack_pointer_rtx,
  				  EH_RETURN_STACKADJ_RTX));
      }
-  if (sibcall_p)
-    emit_use (gen_rtx_REG (SImode, A0_REG));
-  else
-    emit_jump_insn (gen_return ());
  }
  
  void
diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md
index 03e816b8a12..ef826b63e44 100644
--- a/gcc/config/xtensa/xtensa.md
+++ b/gcc/config/xtensa/xtensa.md
@@ -2553,7 +2553,7 @@ 
  	 (match_operand 1 "" ""))]
    ""
  {
-  xtensa_expand_call (0, operands);
+  xtensa_expand_call (0, operands, false);
    DONE;
  })
  
@@ -2574,7 +2574,7 @@ 
  	      (match_operand 2 "" "")))]
    ""
  {
-  xtensa_expand_call (1, operands);
+  xtensa_expand_call (1, operands, false);
    DONE;
  })
  
@@ -2595,7 +2595,7 @@ 
  	 (match_operand 1 "" ""))]
    "!TARGET_WINDOWED_ABI"
  {
-  xtensa_expand_call (0, operands);
+  xtensa_expand_call (0, operands, true);
    DONE;
  })
  
@@ -2616,7 +2616,7 @@ 
  	      (match_operand 2 "" "")))]
    "!TARGET_WINDOWED_ABI"
  {
-  xtensa_expand_call (1, operands);
+  xtensa_expand_call (1, operands, true);
    DONE;
  })
  
@@ -2723,7 +2723,8 @@ 
    [(return)]
    ""
  {
-  xtensa_expand_epilogue (false);
+  xtensa_expand_epilogue ();
+  emit_jump_insn (gen_return ());
    DONE;
  })
  
@@ -2731,7 +2732,7 @@ 
    [(return)]
    "!TARGET_WINDOWED_ABI"
  {
-  xtensa_expand_epilogue (true);
+  xtensa_expand_epilogue ();
    DONE;
  })