This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PR67383][ARM][4.9]Backport of "Allow any register for DImode values in Thumb2"


Hi all,

This is a backport patch to loosen restrictions on core registers for DImode values in Thumb2.

It fixes PR67383. In this particular case, reload tries to spill a hard register, and use next register together as a pair to reload a DImode pseudo register. However, the spilled register number is odd.This is rejected by arm_hard_regno_mode_ok(). There is no other register available, so the compiler throws an ICE.


The test case in PR67383 is too big, so I didn't include it as part of the patch. arm-none-eabi regression test Okay without any new issues. Okay to backport to 4.9?

Regards,
Renlin Li

gcc/ChangeLog:

2015-10-15  Renlin Li  <renlin.li@arm.com>

        PR target/67383
        Backport from mainline.
        2014-04-22  Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>

        * config/arm/arm.c (arm_hard_regno_mode_ok): Loosen
        restrictions on core registers for DImode values in Thumb2.

diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 08b5255..88d957a 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -22646,12 +22646,19 @@ arm_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
     }
 
   /* We allow almost any value to be stored in the general registers.
-     Restrict doubleword quantities to even register pairs so that we can
-     use ldrd.  Do not allow very large Neon structure opaque modes in
-     general registers; they would use too many.  */
+     Restrict doubleword quantities to even register pairs in ARM state
+     so that we can use ldrd.  Do not allow very large Neon structure
+     opaque modes in general registers; they would use too many.  */
   if (regno <= LAST_ARM_REGNUM)
-    return !(TARGET_LDRD && GET_MODE_SIZE (mode) > 4 && (regno & 1) != 0)
-      && ARM_NUM_REGS (mode) <= 4;
+    {
+      if (ARM_NUM_REGS (mode) > 4)
+	  return FALSE;
+
+      if (TARGET_THUMB2)
+	return TRUE;
+
+      return !(TARGET_LDRD && GET_MODE_SIZE (mode) > 4 && (regno & 1) != 0);
+    }
 
   if (regno == FRAME_POINTER_REGNUM
       || regno == ARG_POINTER_REGNUM)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]