S/390: Reject long disp for vector load/store early
authorAndreas Krebbel <krebbel@linux.ibm.com>
Wed, 3 Apr 2019 11:26:09 +0000 (11:26 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 3 Apr 2019 11:26:09 +0000 (11:26 +0000)
The vector memory instructions only support short displacements.
Reject invalid displacements early to prevent plenty of lay
instructions to be generated later which then cannot be merged
properly.

gcc/ChangeLog:

2019-04-03  Andreas Krebbel  <krebbel@linux.ibm.com>

* config/s390/s390.c (s390_legitimate_address_p): Reject long
displacement addresses for vector mode operands.

From-SVN: r270122

gcc/ChangeLog
gcc/config/s390/s390.c

index 48b224a..a280b6c 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-03  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * config/s390/s390.c (s390_legitimate_address_p): Reject long
+       displacement addresses for vector mode operands.
+
 2019-04-03  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/arc/arc.c (GMASK_LEN): Define.
index bceaca3..e0b62b7 100644 (file)
@@ -4677,6 +4677,17 @@ s390_legitimate_address_p (machine_mode mode, rtx addr, bool strict)
   if (!s390_decompose_address (addr, &ad))
     return false;
 
+  /* The vector memory instructions only support short displacements.
+     Reject invalid displacements early to prevent plenty of lay
+     instructions to be generated later which then cannot be merged
+     properly.  */
+  if (TARGET_VX
+      && VECTOR_MODE_P (mode)
+      && ad.disp != NULL_RTX
+      && CONST_INT_P (ad.disp)
+      && !SHORT_DISP_IN_RANGE (INTVAL (ad.disp)))
+    return false;
+
   if (strict)
     {
       if (ad.base && !REGNO_OK_FOR_BASE_P (REGNO (ad.base)))