[PATCH] S/390: Fix ICE in s390_check_qrst_address ()

Ilya Leoshkevich iii@linux.ibm.com
Wed Oct 24 12:27:00 GMT 2018


Bootstrapped and regtested on s390x-redhat-linux.

In r265371 (S/390: Make "b" constraint match literal pool references)
the CONSTANT_POOL_ADDRESS_P () check was moved from
s390_loadrelative_operand_p () to s390_check_qrst_address ().  However,
in the original code it was guarded by SYMBOL_REF_P (), which was not
added to the new code.

gcc/ChangeLog:

2018-10-24  Ilya Leoshkevich  <iii@linux.ibm.com>

	* config/s390/s390.c (s390_check_qrst_address): Add the missing
	SYMBOL_REF_P () check.

gcc/testsuite/ChangeLog:

2018-10-24  Ilya Leoshkevich  <iii@linux.ibm.com>

	* gcc.target/s390/20181024-1.c: New test.
---
 gcc/config/s390/s390.c                     |  4 ++-
 gcc/testsuite/gcc.target/s390/20181024-1.c | 32 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/s390/20181024-1.c

diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index c90509dbc60..29a829f48ea 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -3162,7 +3162,9 @@ s390_check_qrst_address (char c, rtx op, bool lit_pool_ok)
   /* This check makes sure that no symbolic address (except literal
      pool references) are accepted by the R or T constraints.  */
   if (s390_loadrelative_operand_p (op, &symref, NULL)
-      && (!lit_pool_ok || !CONSTANT_POOL_ADDRESS_P (symref)))
+      && (!lit_pool_ok
+          || !SYMBOL_REF_P (symref)
+          || !CONSTANT_POOL_ADDRESS_P (symref)))
     return 0;
 
   /* Ensure literal pool references are only accepted if LIT_POOL_OK.  */
diff --git a/gcc/testsuite/gcc.target/s390/20181024-1.c b/gcc/testsuite/gcc.target/s390/20181024-1.c
new file mode 100644
index 00000000000..830ab5b927c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/20181024-1.c
@@ -0,0 +1,32 @@
+/* Make sure s390_check_qrst_address () correctly handles UNSPEC rtxs.  */
+/* { dg-compile } */
+/* { dg-options "-march=z196 -O2 -fPIC" } */
+
+int a, b, g, h;
+struct
+{
+  int i;
+  struct
+  {
+    int d;
+  } k[];
+} f;
+
+void m(int);
+
+void l()
+{
+  int j;
+  for (; h;)
+    {
+      m((
+	{
+	  __asm__("" : "=r"(g));
+	  b;
+	}
+      ));
+      f.k[j].d = a;
+      j++;
+    }
+  f.i = j;
+}
-- 
2.19.0



More information about the Gcc-patches mailing list