[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