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.

Committed to mainline after bootstrapping and regtesting on IBM z14.

gcc/ChangeLog:

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

        * config/s390/s390.c (s390_legitimate_address_p): Reject long
        displacement addresses for vector mode operands.
---
 gcc/config/s390/s390.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index bceaca3fbc8..e0b62b741f2 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -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)))
-- 
2.17.1

Reply via email to