aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.ibm.com>2019-04-03 11:26:09 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2019-04-03 11:26:09 +0000
commit615792b72e34b084e4aa69aad7789f2ee30e2eed (patch)
tree951bd2a81afd789a5e3279cfc162d619f2281405 /gcc
parent487efcfdaca9cf95a4976b096d632cfff4dc22de (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-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)))