aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMatthew Malcomson <matthew.malcomson@arm.com>2020-04-15 12:24:39 +0100
committerMatthew Malcomson <matthew.malcomson@arm.com>2020-04-15 12:24:39 +0100
commitd2f9e6ad0ce9e1e40821243fa9d01b7fdc42f32c (patch)
tree4f020577d0453b3701743e78aeeedb614cdba72c /gcc
parent5b2f76e36d861c881c6770b4f47c1fae6c0c8965 (diff)
downloadgcc-d2f9e6ad0ce9e1e40821243fa9d01b7fdc42f32c.zip
gcc-d2f9e6ad0ce9e1e40821243fa9d01b7fdc42f32c.tar.gz
gcc-d2f9e6ad0ce9e1e40821243fa9d01b7fdc42f32c.tar.bz2
[Arm] Disallow arm_movdi when targetting MVE
Without disabling this, the pattern can try and move DImode values between floating point registers and general registers. The constraints on this pattern can't handle that, and reload goes into an infinite loop. This was the cause of a testsuite failure in cde_v_1_mve.c, which is now gone. A DImode move for MVE now uses the `movdi_vfp` pattern, which is the same pattern used for such a move when MVE is not available but the target has TARGET_HARD_FLOAT. Testing done: Bootstrapped and regtested on arm-none-linux-gnueabihf regtested on arm-none-eabi gcc/ChangeLog: 2020-04-15 Matthew Malcomson <matthew.malcomson@arm.com> * config/arm/arm.md (arm_movdi): Disallow for MVE.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/arm/arm.md1
2 files changed, 5 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2d6c5c8..82e0cd6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2020-04-15 Matthew Malcomson <matthew.malcomson@arm.com>
+
+ * config/arm/arm.md (arm_movdi): Disallow for MVE.
+
2020-04-15 Richard Biener <rguenther@suse.de>
PR middle-end/94539
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 7bc55cc..a6a31f8 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -6233,6 +6233,7 @@
(match_operand:DI 1 "di_operand" "rDa,Db,Dc,mi,r"))]
"TARGET_32BIT
&& !(TARGET_HARD_FLOAT)
+ && !(TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT)
&& !TARGET_IWMMXT
&& ( register_operand (operands[0], DImode)
|| register_operand (operands[1], DImode))"