https://gcc.gnu.org/g:8d29e1c4ceaea4d3ceec6b51de5b7c31a6bc5f85
commit r12-10728-g8d29e1c4ceaea4d3ceec6b51de5b7c31a6bc5f85 Author: Stefan Schulze Frielinghaus <stefa...@gcc.gnu.org> Date: Fri Sep 27 12:45:42 2024 +0200 s390: Fix AQ and AR constraints Ensure for AQ and AR constraints that the resulting displacement after adding any positive offset less than the size of the object being referenced is still valid. gcc/ChangeLog: * config/s390/s390.cc (s390_mem_constraint): Check displacement for AQ and AR constraints. (cherry picked from commit 1a71ff3b89aadc7fa0af0bca269d74bb23c1a957) Diff: --- gcc/config/s390/s390.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc index b66fc5be8719..2be3a873b891 100644 --- a/gcc/config/s390/s390.cc +++ b/gcc/config/s390/s390.cc @@ -3405,6 +3405,18 @@ s390_mem_constraint (const char *str, rtx op) if ((reload_completed || reload_in_progress) ? !offsettable_memref_p (op) : !offsettable_nonstrict_memref_p (op)) return 0; + /* offsettable_memref_p ensures only that any positive offset added to + the address forms a valid general address. For AQ and AR constraints + we also have to verify that the resulting displacement after adding + any positive offset less than the size of the object being referenced + is still valid. */ + if (str[1] == 'Q' || str[1] == 'R') + { + int o = GET_MODE_SIZE (GET_MODE (op)) - 1; + rtx tmp = adjust_address (op, QImode, o); + if (!s390_check_qrst_address (str[1], XEXP (tmp, 0), true)) + return 0; + } return s390_check_qrst_address (str[1], XEXP (op, 0), true); case 'B': /* Check for non-literal-pool variants of memory constraints. */