SMALL_REGISTER_CLASSES was added by

commit c98f874233428d7e6ba83def7842fd703ac0ddf1
Author: James Van Artsdalen <j...@gnu.org>
Date:   Sun Feb 9 13:28:48 1992 +0000

    Initial revision

which became TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P.  It is false from
day 1 for i386.  Since x86-64 doubles the number of registers, Change
TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P to return false for x86-64
and update decrease_live_ranges_number to skip hard register if
targetm.class_likely_spilled_p returns true.  These extend the live
range of rbp, r8-r31 and xmm1-xmm31 registers.

        PR target/118996
        * ira.cc (decrease_live_ranges_number): Skip hard register if
        targetm.class_likely_spilled_p returns true.
        * config/i386/i386.cc (ix86_small_register_classes_for_mode_p):
        New.
        (TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P): Use it.

Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
---
 gcc/config/i386/i386.cc | 15 ++++++++++-----
 gcc/ira.cc              |  4 ++++
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index bfd9cac215a..a123fe9992f 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -20739,6 +20739,14 @@ ix86_secondary_reload (bool in_p, rtx x, reg_class_t 
rclass,
   return NO_REGS;
 }
 
+/* Implement TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P.  */
+
+static bool
+ix86_small_register_classes_for_mode_p (machine_mode)
+{
+  return !TARGET_64BIT;
+}
+
 /* Implement TARGET_CLASS_LIKELY_SPILLED_P.  */
 
 static bool
@@ -27449,12 +27457,9 @@ ix86_libgcc_floating_mode_supported_p
 #define TARGET_PREFERRED_RELOAD_CLASS ix86_preferred_reload_class
 #undef TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS ix86_preferred_output_reload_class
-/* When this hook returns true for MODE, the compiler allows
-   registers explicitly used in the rtl to be used as spill registers
-   but prevents the compiler from extending the lifetime of these
-   registers.  */
 #undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
-#define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P hook_bool_mode_true
+#define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
+  ix86_small_register_classes_for_mode_p
 #undef TARGET_CLASS_LIKELY_SPILLED_P
 #define TARGET_CLASS_LIKELY_SPILLED_P ix86_class_likely_spilled_p
 #undef TARGET_CALLEE_SAVE_COST
diff --git a/gcc/ira.cc b/gcc/ira.cc
index 885239d1b43..e93a596e2a9 100644
--- a/gcc/ira.cc
+++ b/gcc/ira.cc
@@ -2158,6 +2158,10 @@ decrease_live_ranges_number (void)
            || (targetm.small_register_classes_for_mode_p (GET_MODE (src))
                && (sregno < FIRST_PSEUDO_REGISTER
                    || dregno < FIRST_PSEUDO_REGISTER))
+           || (sregno < FIRST_PSEUDO_REGISTER
+               && targetm.class_likely_spilled_p (REGNO_REG_CLASS (sregno)))
+           || (dregno < FIRST_PSEUDO_REGISTER
+               && targetm.class_likely_spilled_p (REGNO_REG_CLASS (dregno)))
            /* We don't see all updates to SP if they are in an
               auto-inc memory reference, so we must disallow this
               optimization on them.  */
-- 
2.49.0

Reply via email to