This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PR67383][ARM][4.9]Backport of "Allow any register for DImode values in Thumb2"
- From: Renlin Li <renlin dot li at arm dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: Ramana Radhakrishnan <Ramana dot Radhakrishnan at arm dot com>, vmakarov at redhat dot com, Kyrill Tkachov <kyrylo dot tkachov at arm dot com>
- Date: Thu, 15 Oct 2015 15:01:24 +0100
- Subject: [PR67383][ARM][4.9]Backport of "Allow any register for DImode values in Thumb2"
- Authentication-results: sourceware.org; auth=none
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)