[gcc(refs/users/meissner/heads/work168-test)] Possibly restrict SPRs from holding small integers or CCs.
Michael Meissner
meissner@gcc.gnu.org
Thu Jun 13 18:50:51 GMT 2024
https://gcc.gnu.org/g:d1a8b7b62c9e590b6eb9486fbfc207134a0994d0
commit d1a8b7b62c9e590b6eb9486fbfc207134a0994d0
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Thu Jun 13 14:50:24 2024 -0400
Possibly restrict SPRs from holding small integers or CCs.
2024-06-13 Michael Meissner <meissner@linux.ibm.com>
* config/rs6000/rs6000.cc (rs6000_hard_regno_mode_ok_uncached): Add
support for -mccspr and -mintspr which controls whether SPRs can hold
condition code modes or small integers.
(rs6000_debug_reg_global): Print out -mccspr and -mintspr options.
* config/rs6000/rs6000.opt (-mccspr): New option.
(-mintspr): Likewise.
Diff:
---
gcc/config/rs6000/rs6000.cc | 35 +++++++++++++++++++++++++++++------
gcc/config/rs6000/rs6000.opt | 8 ++++++++
2 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 16c66c102031..43ecb432adef 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -1940,16 +1940,33 @@ rs6000_hard_regno_mode_ok_uncached (int regno, machine_mode mode)
return mode == Pmode || mode == SImode;
/* Do some consistancy checks for SPRs. Don't allow complex modes.
- VRSAVE/VSCR are always 32-bit SPRs. Don't allow floating point modes in
- the other SPRs. Don't allow large modes that don't fit in a single
- register. */
+
+ VRSAVE/VSCR are always 32-bit SPRs.
+
+ Don't allow floating point modes in the other SPRs. Don't allow large
+ modes that don't fit in a single register.
+
+ Optionally restrict integer modes to be size of pointers which means the
+ register allocator will not use the SPR to hold QImode, HImode, and maybe
+ SImode values instead of spilling them to the stack.
+
+ Optionally restrict SPRs not to hold condition codes. */
if (regno == VRSAVE_REGNO || regno == VSCR_REGNO)
return (!orig_complex_p && mode == SImode);
if (regno == LR_REGNO || regno == CTR_REGNO)
- return (!orig_complex_p
- && GET_MODE_SIZE (mode) <= UNITS_PER_WORD
- && !SCALAR_FLOAT_MODE_P (mode));
+ {
+ if (orig_complex_p || GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+ return 0;
+
+ if (GET_MODE_CLASS (mode) == MODE_CC)
+ return TARGET_CCSPR != 0;
+
+ if (GET_MODE_CLASS (mode) == MODE_INT)
+ return (TARGET_INTSPR || mode == Pmode);
+
+ return 0;
+ }
/* AltiVec only in AldyVec registers. */
if (ALTIVEC_REGNO_P (regno))
@@ -2606,6 +2623,12 @@ rs6000_debug_reg_global (void)
if (TARGET_DIRECT_MOVE_128)
fprintf (stderr, DEBUG_FMT_D, "VSX easy 64-bit mfvsrld element",
(int)VECTOR_ELEMENT_MFVSRLD_64BIT);
+
+ fprintf (stderr, DEBUG_FMT_S, "Condition modes in SPRS",
+ TARGET_CCSPR ? "yes" : "no");
+
+ fprintf (stderr, DEBUG_FMT_S, "Small integer modes in SPRS",
+ TARGET_INTSPR ? "yes" : "no");
}
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 70fd7080bc52..7208070f54c6 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -630,6 +630,14 @@ mieee128-constant
Target Var(TARGET_IEEE128_CONSTANT) Init(1) Save
Generate (do not generate) code that uses the LXVKQ instruction.
+mccspr
+Target Var(TARGET_CCSPR) Init(1)
+Generate (do not generate) code that allows SPRs to hold condition codes.
+
+mintspr
+Target Var(TARGET_INTSPR) Init(1)
+Generate (do not generate) code that allows SPRs to hold small integers.
+
; Documented parameters
-param=rs6000-vect-unroll-limit=
More information about the Gcc-cvs
mailing list