aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/s390/s390.c11
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 48b224a..a280b6c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index bceaca3..e0b62b7 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)))