diff options
author | Andreas Krebbel <krebbel@linux.ibm.com> | 2019-04-03 11:26:09 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2019-04-03 11:26:09 +0000 |
commit | 615792b72e34b084e4aa69aad7789f2ee30e2eed (patch) | |
tree | 951bd2a81afd789a5e3279cfc162d619f2281405 | |
parent | 487efcfdaca9cf95a4976b096d632cfff4dc22de (diff) | |
download | gcc-615792b72e34b084e4aa69aad7789f2ee30e2eed.zip gcc-615792b72e34b084e4aa69aad7789f2ee30e2eed.tar.gz gcc-615792b72e34b084e4aa69aad7789f2ee30e2eed.tar.bz2 |
S/390: Reject long disp for vector load/store early
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
-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))) |