* [PATCH 1/2] xtensa: Resurrect LEAF_REGISTERS and LEAF_REG_REMAP
[not found] <2cc8ab8b-84fe-4930-ba84-257b2458120e.ref@yahoo.co.jp>
@ 2024-03-26 14:44 ` Takayuki 'January June' Suwa
0 siblings, 0 replies; only message in thread
From: Takayuki 'January June' Suwa @ 2024-03-26 14:44 UTC (permalink / raw)
To: GCC Patches; +Cc: Max Filippov
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 --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 */
--
2.39.2
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2024-03-26 14:46 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <2cc8ab8b-84fe-4930-ba84-257b2458120e.ref@yahoo.co.jp>
2024-03-26 14:44 ` [PATCH 1/2] xtensa: Resurrect LEAF_REGISTERS and LEAF_REG_REMAP Takayuki 'January June' Suwa
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).