https://gcc.gnu.org/g:1670d3259dec8abf445ed4f282dcbf3a1e0d3032

commit r14-10712-g1670d3259dec8abf445ed4f282dcbf3a1e0d3032
Author: Stefan Schulze Frielinghaus <stefa...@gcc.gnu.org>
Date:   Thu Sep 26 19:38:02 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 4be95788094c..2619a9ac9861 100644
--- a/gcc/config/s390/s390.cc
+++ b/gcc/config/s390/s390.cc
@@ -3552,6 +3552,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.  */

Reply via email to