[AArch64] Fix preferred_reload_class for regclass STACK_REG.
diff mbox

Message ID 525EA29D.406@arm.com
State New
Headers show

Commit Message

Marcus Shawcroft Oct. 16, 2013, 2:28 p.m. UTC
The existing AArch64 implementation of preferred_reload_class when 
called with a destination regclass STACK_REG returns the wider register 
class GENERAL_REG.  This patch changes the behavior such that we only 
return a narrower class (or NO_REGS) and never return a wider class.

I'll leave this on the list 24h before committing.

/Marcus


2013-10-16  Marcus Shawcroft  <marcus.shawcroft@arm.com>

         * config/aarch64/aarch64.c (aarch64_preferred_reload_class): Adjust
         handling of STACK_REG.

Patch
diff mbox

diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index da3962f..7fce7a0 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -4219,9 +4219,18 @@  aarch64_class_max_nregs (reg_class_t regclass, enum machine_mode mode)
 static reg_class_t
 aarch64_preferred_reload_class (rtx x, reg_class_t regclass)
 {
-  if (regclass == POINTER_REGS || regclass == STACK_REG)
+  if (regclass == POINTER_REGS)
     return GENERAL_REGS;
 
+  if (regclass == STACK_REG)
+    {
+      if (REG_P(x)
+	  && reg_class_subset_p (REGNO_REG_CLASS (REGNO (x)), POINTER_REGS))
+	  return regclass;
+
+      return NO_REGS;
+    }
+
   /* If it's an integer immediate that MOVI can't handle, then
      FP_REGS is not an option, so we return NO_REGS instead.  */
   if (CONST_INT_P (x) && reg_class_subset_p (regclass, FP_REGS)