]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm: allow type-punning subregs in vpr_register_operand [PR115439]
authorRichard Earnshaw <rearnsha@arm.com>
Mon, 10 Mar 2025 14:12:38 +0000 (14:12 +0000)
committerRichard Earnshaw <rearnsha@arm.com>
Wed, 12 Mar 2025 14:33:53 +0000 (14:33 +0000)
Subregs that only change the mode of an operand (ie don't change the
size) should be safe for the VPR register.  If we don't permit them
we may end up with some redundant copy instructions.

gcc:
PR target/115439
* config/arm/predicates.md (vpr_register_operand): Allow type-punning
subregs.

gcc/config/arm/predicates.md

index 5c78421ff69709b7e058a45a0baefe861130ff4b..75c06d9be255257e1c6783a157a4c72274c0b234 100644 (file)
 })
 
 (define_predicate "vpr_register_operand"
-  (match_code "reg")
+  (match_code "reg,subreg")
 {
-  return REG_P (op)
+  if (SUBREG_P (op))
+    {
+      /* Only allow subregs if they are strictly type punning. */
+      if ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (op)))
+          != GET_MODE_SIZE (GET_MODE (op)))
+         || SUBREG_BYTE (op) != 0)
+       return false;
+      op = SUBREG_REG (op);
+    }
+
+  return (REG_P (op)
          && (REGNO (op) >= FIRST_PSEUDO_REGISTER
-             || IS_VPR_REGNUM (REGNO (op)));
+             || IS_VPR_REGNUM (REGNO (op))));
 })
 
 (define_predicate "imm_for_neon_inv_logic_operand"