diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 11 |
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))) |