https://gcc.gnu.org/g:6e4045513d789587b2c7750e9016c7035b461299
commit r15-7998-g6e4045513d789587b2c7750e9016c7035b461299 Author: Richard Earnshaw <rearn...@arm.com> Date: Mon Mar 10 14:12:38 2025 +0000 arm: allow type-punning subregs in vpr_register_operand [PR115439] 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. Diff: --- gcc/config/arm/predicates.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/gcc/config/arm/predicates.md b/gcc/config/arm/predicates.md index 5c78421ff697..75c06d9be255 100644 --- a/gcc/config/arm/predicates.md +++ b/gcc/config/arm/predicates.md @@ -99,11 +99,21 @@ }) (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"