[gcc(refs/vendors/ARM/heads/arm-struct-reorg-wip)] [Arm] Disallow arm_movdi when targetting MVE

Tamar Christina tnfchris@gcc.gnu.org
Fri Jul 17 14:25:57 GMT 2020


https://gcc.gnu.org/g:d2f9e6ad0ce9e1e40821243fa9d01b7fdc42f32c

commit d2f9e6ad0ce9e1e40821243fa9d01b7fdc42f32c
Author: Matthew Malcomson <matthew.malcomson@arm.com>
Date:   Wed Apr 15 12:24:39 2020 +0100

    [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.

Diff:
---
 gcc/ChangeLog         | 4 ++++
 gcc/config/arm/arm.md | 1 +
 2 files changed, 5 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2d6c5c88b7d..82e0cd61b00 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 7bc55cce61b..a6a31f8f4ef 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))"


More information about the Gcc-cvs mailing list