Tested on hppa-unknown-linux-gnu and hppa64-hp-hpux11.11. Committed to trunk.
Dave --- hppa: Fix hppa_rtx_costs_shadd_p to handle subregs in inner operands Fixes gcc.target/hppa/shadd-4.c on hppa64-hp-hpux11.11. 2026-10-04 John David Anglin <[email protected]> gcc/ChangeLog: * config/pa/pa.cc (hppa_rtx_costs_shadd_p): Strip SUBREG wrappers from inner operands when checking if X represents a possible shadd pattern. diff --git a/gcc/config/pa/pa.cc b/gcc/config/pa/pa.cc index d29e376dcb5..c9abc21954c 100644 --- a/gcc/config/pa/pa.cc +++ b/gcc/config/pa/pa.cc @@ -1667,23 +1667,43 @@ hppa_address_cost (rtx X, machine_mode mode ATTRIBUTE_UNUSED, static bool hppa_rtx_costs_shadd_p (rtx x) { - if (GET_CODE (x) != PLUS - || !REG_P (XEXP (x, 1))) + if (GET_CODE (x) != PLUS) return false; + + /* Check if operand 1 is a REG or a SUBREG of a REG. */ + rtx op1 = XEXP (x, 1); + if (SUBREG_P (op1)) + op1 = SUBREG_REG (op1); + if (!REG_P (op1)) + return false; + rtx op0 = XEXP (x, 0); if (GET_CODE (op0) == ASHIFT - && CONST_INT_P (XEXP (op0, 1)) - && REG_P (XEXP (op0, 0))) + && CONST_INT_P (XEXP (op0, 1))) { - unsigned HOST_WIDE_INT x = UINTVAL (XEXP (op0, 1)); - return x == 1 || x == 2 || x == 3; + rtx inner0 = XEXP (op0, 0); + + if (SUBREG_P (inner0)) + inner0 = SUBREG_REG (inner0); + + if (REG_P (inner0)) + { + unsigned HOST_WIDE_INT shift_val = UINTVAL (XEXP (op0, 1)); + return shift_val == 1 || shift_val == 2 || shift_val == 3; + } } if (GET_CODE (op0) == MULT - && CONST_INT_P (XEXP (op0, 1)) - && REG_P (XEXP (op0, 0))) + && CONST_INT_P (XEXP (op0, 1))) { - unsigned HOST_WIDE_INT x = UINTVAL (XEXP (op0, 1)); - return x == 2 || x == 4 || x == 8; + rtx inner0 = XEXP (op0, 0); + if (SUBREG_P (inner0)) + inner0 = SUBREG_REG (inner0); + + if (REG_P (inner0)) + { + unsigned HOST_WIDE_INT mult_val = UINTVAL (XEXP (op0, 1)); + return mult_val == 2 || mult_val == 4 || mult_val == 8; + } } return false; }
signature.asc
Description: PGP signature
