From: Richard Earnshaw Date: Mon, 10 Mar 2025 14:12:38 +0000 (+0000) Subject: arm: allow type-punning subregs in vpr_register_operand [PR115439] X-Git-Tag: basepoints/gcc-16~1555 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e4045513d789587b2c7750e9016c7035b461299;p=thirdparty%2Fgcc.git 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 --git a/gcc/config/arm/predicates.md b/gcc/config/arm/predicates.md index 5c78421ff69..75c06d9be25 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"