> -----Original Message-----
> From: Matthew Malcomson <matthew.malcom...@arm.com>
> Sent: 15 April 2020 11:23
> To: gcc-patches@gcc.gnu.org
> Cc: Kyrylo Tkachov <kyrylo.tkac...@arm.com>; Ramana Radhakrishnan
> <ramana.radhakrish...@arm.com>; Richard Earnshaw
> <richard.earns...@arm.com>; nd <n...@arm.com>
> Subject: [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.
>
Ok.
Thanks,
Kyrill
> Testing done:
> Bootstrapped and regtested on arm-none-linux-gnueabihf
> regtested on arm-none-eabi
>
> gcc/ChangeLog:
>
> 2020-04-15 Matthew Malcomson <matthew.malcom...@arm.com>
>
> * config/arm/arm.md (arm_movdi): Disallow for MVE.
>
>
>
> ############### Attachment also inlined for ease of reply
> ###############
>
>
> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
> index
> 7bc55cce61b2e45e5875a233dd4546d59399d749..a6a31f8f4ef8d3c8c96c61b4
> 50dbd7c28d08b55c 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))"