]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390: Fix AQ and AR constraints
authorStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Fri, 13 Sep 2024 13:05:33 +0000 (15:05 +0200)
committerStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Fri, 13 Sep 2024 13:05:33 +0000 (15:05 +0200)
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.

gcc/config/s390/s390.cc

index c1649ca49bd13f50e818cc61e514d4799a24b8b5..926987113dd47f440396c587f9e56e07c7cf0a0b 100644 (file)
@@ -3689,6 +3689,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.  */