diff mbox series

[1/2] xtensa: Resurrect LEAF_REGISTERS and LEAF_REG_REMAP

Message ID 2cc8ab8b-84fe-4930-ba84-257b2458120e@yahoo.co.jp
State New
Headers show
Series [1/2] xtensa: Resurrect LEAF_REGISTERS and LEAF_REG_REMAP | expand

Commit Message

Takayuki 'January June' Suwa March 26, 2024, 2:44 p.m. UTC
They were once mistakenly removed with
"xtensa: Remove old broken tweak for leaf function", but caused unwanted
register spills.

gcc/ChangeLog:

	* config/xtensa/xtensa.h (LEAF_REGISTERS, LEAF_REG_REMAP):
	Withdraw the removal.
	(REG_ALLOC_ORDER): Cosmetics.
	* config/xtensa/xtensa.cc (xtensa_leaf_regs): Withdraw the removal.
	(xtensa_adjust_reg_alloc_order): Cosmetics.
---
 gcc/config/xtensa/xtensa.cc | 45 ++++++++++++++++++++++++++++++-------
 gcc/config/xtensa/xtensa.h  | 29 ++++++++++++++++++++++--
 2 files changed, 64 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc
index 9beac932467..df888294556 100644
--- a/gcc/config/xtensa/xtensa.cc
+++ b/gcc/config/xtensa/xtensa.cc
@@ -110,6 +110,18 @@  struct GTY(()) machine_function
   HARD_REG_SET eliminated_callee_saved;
 };
 
+/* Vector, indexed by hard register number, which contains 1 for a
+   register that is allowable in a candidate for leaf function
+   treatment.  */
+
+const char xtensa_leaf_regs[FIRST_PSEUDO_REGISTER] =
+{
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1
+};
+
 static void xtensa_option_override (void);
 static enum internal_test map_test_to_internal_test (enum rtx_code);
 static rtx gen_int_relational (enum rtx_code, rtx, rtx);
@@ -4314,15 +4326,32 @@  void
 xtensa_adjust_reg_alloc_order (void)
 {
   static const int reg_windowed_alloc_order[FIRST_PSEUDO_REGISTER] =
-	REG_ALLOC_ORDER;
+    REG_ALLOC_ORDER;
   static const int reg_call0_alloc_order[FIRST_PSEUDO_REGISTER] =
-  {
-     9, 10, 11,  7,  6,  5,  4,  3,  2,  8,  0, 12, 13, 14, 15,
-    18,
-    19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-     1, 16, 17,
-    35,
-  };
+    {
+      /*  a9 ... a11 : no special usage */
+       9, 10, 11,
+      /*  a7 ...  a2 : function arguments, in reverse order */
+       7,  6,  5,  4,  3,  2,
+      /*  a8	     : static chain */
+       8,
+      /*  a0	     : return address (also callee saved) */
+       0,
+      /* a12 ... a15 : callee saved */
+      12, 13, 14, 15,
+      /*  b0	     : boolean register for floating-point CC */
+      18,
+      /*  f0 ... f15 : floating-point registers */
+      19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+      /*  sp	     : stack pointer */
+       1,
+      /*  fp	     : FRAME_POINTER (fake) */
+      16,
+      /* argp	     : ARG_POINTER (fake) */
+      17,
+      /* acc	     : MAC16 accumulator */
+      35,
+    };
 
   memcpy (reg_alloc_order, TARGET_WINDOWED_ABI ?
 	  reg_windowed_alloc_order : reg_call0_alloc_order,
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index 9591b3d4b40..835cb4bbf3b 100644
--- a/gcc/config/xtensa/xtensa.h
+++ b/gcc/config/xtensa/xtensa.h
@@ -248,14 +248,39 @@  along with GCC; see the file COPYING3.  If not see
 
 #define REG_ALLOC_ORDER							\
 {									\
-   8,  9, 10, 11, 12, 13, 14, 15,  7,  6,  5,  4,  3,  2,		\
+  /*  a8 ... a15 : no special usage */					\
+   8,  9, 10, 11, 12, 13, 14, 15,					\
+  /*  a7 ...  a2 : incoming arguments, in reverse order */		\
+   7,  6,  5,  4,  3,  2,						\
+  /*  b0	 : boolean register for floating-point CC */		\
   18,									\
+  /*  f0 ... f15 : floating-point registers */				\
   19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,	\
-   0,  1, 16, 17,							\
+  /*  a0	 : return address */					\
+   0,									\
+  /*  sp	 : stack pointer */					\
+   1,									\
+  /*  fp	 : FRAME_POINTER (fake) */				\
+  16,									\
+  /* argp	 : ARG_POINTER (fake) */				\
+  17,									\
+  /* acc	 : MAC16 accumulator */					\
   35,									\
 }
 #define ADJUST_REG_ALLOC_ORDER xtensa_adjust_reg_alloc_order ()
 
+/* For Xtensa, the only point of this is to prevent GCC from otherwise
+   giving preference to call-used registers.  To minimize window
+   overflows for the AR registers, we want to give preference to the
+   lower-numbered AR registers.  For other register files, which are
+   not windowed, we still prefer call-used registers, if there are any.  */
+extern const char xtensa_leaf_regs[FIRST_PSEUDO_REGISTER];
+#define LEAF_REGISTERS xtensa_leaf_regs
+
+/* For Xtensa, no remapping is necessary, but this macro must be
+   defined if LEAF_REGISTERS is defined.  */
+#define LEAF_REG_REMAP(REGNO) ((int) (REGNO))
+
 /* Internal macros to classify a register number.  */
 
 /* 16 address registers + fake registers */