gcc/lower_subreg.c: Prevent decomposition if modes are not tieable
authorJonathan Wright <jonathan.wright@arm.com>
Thu, 14 Oct 2021 12:49:02 +0000 (13:49 +0100)
committerJonathan Wright <jonathan.wright@arm.com>
Thu, 4 Nov 2021 14:55:44 +0000 (14:55 +0000)
Preventing decomposition if modes are not tieable is necessary to
stop AArch64 partial Neon structure modes being treated as packed in
registers.

This is a necessary prerequisite for a future AArch64 PCS change to
maintain good code generation.

gcc/ChangeLog:

2021-10-14  Jonathan Wright  <jonathan.wright@arm.com>

* lower-subreg.c (simple_move): Prevent decomposition if
modes are not tieable.

gcc/lower-subreg.c

index 2107826..f0dc63f 100644 (file)
@@ -383,8 +383,10 @@ simple_move (rtx_insn *insn, bool speed_p)
      non-integer mode for which there is no integer mode of the same
      size.  */
   mode = GET_MODE (SET_DEST (set));
+  scalar_int_mode int_mode;
   if (!SCALAR_INT_MODE_P (mode)
-      && !int_mode_for_size (GET_MODE_BITSIZE (mode), 0).exists ())
+      && (!int_mode_for_size (GET_MODE_BITSIZE (mode), 0).exists (&int_mode)
+         || !targetm.modes_tieable_p (mode, int_mode)))
     return NULL_RTX;
 
   /* Reject PARTIAL_INT modes.  They are used for processor specific