S/390: Reject invalid Q/R/S/T addresses after LRA
authorIlya Leoshkevich <iii@linux.ibm.com>
Tue, 12 Feb 2019 14:51:39 +0000 (14:51 +0000)
committerIlya Leoshkevich <iii@gcc.gnu.org>
Tue, 12 Feb 2019 14:51:39 +0000 (14:51 +0000)
The following insn:

(insn (set (reg:DI %r2)
           (sign_extend:DI (mem:SI
            (const:DI (plus:DI (symbol_ref:DI ("*.LC0"))
                               (const_int 16)))))))

is correctly recognized by LRA as RIL alternative of extendsidi2
define_insn.  However, when recognition runs after LRA, it returns RXY
alternative, which is incorrect, since the offset 16 points past the
end of of *.LC0 literal pool entry.  Such addresses are normally
rejected by s390_decompose_address ().

This inconsistency confuses annotate_constant_pool_refs: the selected
alternative makes it proceed with annotation, only to find that the
annotated address is invalid, causing ICE.

This patch fixes the root cause, namely, that s390_check_qrst_address ()
behaves differently during and after LRA.

gcc/ChangeLog:

2019-02-12  Ilya Leoshkevich  <iii@linux.ibm.com>

PR target/89233
* config/s390/s390.c (s390_decompose_address): Update comment.
(s390_check_qrst_address): Reject invalid address forms after
LRA.

gcc/testsuite/ChangeLog:

2019-02-12  Ilya Leoshkevich  <iii@linux.ibm.com>

PR target/89233
* gcc.target/s390/pr89233.c: New test.

From-SVN: r268798

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/pr89233.c [new file with mode: 0644]

index 4cf4f017664e83fc80634e69ce9d8d3f7c1e8a80..3c90ff8a9d0d61a414c44a8d9cf654760cb07adc 100644 (file)
@@ -1,3 +1,10 @@
+2019-02-12  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       PR target/89233
+       * config/s390/s390.c (s390_decompose_address): Update comment.
+       (s390_check_qrst_address): Reject invalid address forms after
+       LRA.
+
 2019-02-12  Martin Liska  <mliska@suse.cz>
 
        PR lto/88876
index 6a571a3e05438bb6e9db2797cdb367acd6f71177..713973a3fd4a94e1516e1f0711b69d31bbc9c07d 100644 (file)
@@ -3020,7 +3020,9 @@ s390_decompose_address (rtx addr, struct s390_address *out)
          if (offset)
            {
              /* If we have an offset, make sure it does not
-                exceed the size of the constant pool entry.  */
+                exceed the size of the constant pool entry.
+                Otherwise we might generate an out-of-range
+                displacement for the base register form.  */
              rtx sym = XVECEXP (disp, 0, 0);
              if (offset >= GET_MODE_SIZE (get_pool_mode (sym)))
                return false;
@@ -3193,8 +3195,10 @@ s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
      generic cases below ('R' or 'T'), since reload will in fact fix
      them up.  LRA behaves differently here; we never see such forms,
      but on the other hand, we need to strictly reject every invalid
-     address form.  Perform this check right up front.  */
-  if (lra_in_progress)
+     address form.  After both reload and LRA invalid address forms
+     must be rejected, because nothing will fix them up later.  Perform
+     this check right up front.  */
+  if (lra_in_progress || reload_completed)
     {
       if (!decomposed && !s390_decompose_address (op, &addr))
        return 0;
index adfe1ae033a3bb44f918241f19983de986f7c958..7cb2c4144898c049b4f4bb52e600888c3dff6ee6 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-12  Ilya Leoshkevich  <iii@linux.ibm.com>
+
+       PR target/89233
+       * gcc.target/s390/pr89233.c: New test.
+
 2018-01-12  Bill Schmidt  <wschmidt@linux.ibm.com>
 
        * gcc.target/powerpc/vec-sld-modulo.c: Require p8vector_hw.
diff --git a/gcc/testsuite/gcc.target/s390/pr89233.c b/gcc/testsuite/gcc.target/s390/pr89233.c
new file mode 100644 (file)
index 0000000..f572bfa
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-march=z13 -O1" } */
+
+typedef int v4si __attribute__ ((vector_size (16)));
+
+int
+f ()
+{
+  v4si x = {0, 1, 2, 3};
+  return x[4];
+}