The HI/QI atomic_fetch_<atomic><mode>" expander accepted symbolic
references and emitted CAS patterns whose insn predicates rejected them.

Fixed by allowing symbolic references there as well.  Reload will get
rid of them due to the constraint letter.

Regression tested on s390x.

Committed to mainline and GCC 7 branch.

gcc/ChangeLog:

2017-07-27  Andreas Krebbel  <kreb...@linux.vnet.ibm.com>

        PR target/81534
        * config/s390/s390.md ("*atomic_compare_and_swap<mode>_1")
        ("*atomic_compare_and_swapdi_2", "*atomic_compare_and_swapsi_3"):
        Change s_operand to memory_operand.

gcc/testsuite/ChangeLog:

2017-07-27  Andreas Krebbel  <kreb...@linux.vnet.ibm.com>

        PR target/81534
        * gcc.target/s390/pr81534.c: New test.
---
 gcc/config/s390/s390.md                 |  6 +++---
 gcc/testsuite/gcc.target/s390/pr81534.c | 17 +++++++++++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/s390/pr81534.c

diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index 0eef9b1..d1ac0b8 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -10266,7 +10266,7 @@
 ; cdsg, csg
 (define_insn "*atomic_compare_and_swap<mode>_1"
   [(set (match_operand:TDI 0 "register_operand" "=r")
-       (match_operand:TDI 1 "s_operand" "+S"))
+       (match_operand:TDI 1 "memory_operand" "+S"))
    (set (match_dup 1)
        (unspec_volatile:TDI
          [(match_dup 1)
@@ -10284,7 +10284,7 @@
 ; cds, cdsy
 (define_insn "*atomic_compare_and_swapdi_2"
   [(set (match_operand:DI 0 "register_operand" "=r,r")
-       (match_operand:DI 1 "s_operand" "+Q,S"))
+       (match_operand:DI 1 "memory_operand" "+Q,S"))
    (set (match_dup 1)
        (unspec_volatile:DI
          [(match_dup 1)
@@ -10305,7 +10305,7 @@
 ; cs, csy
 (define_insn "*atomic_compare_and_swapsi_3"
   [(set (match_operand:SI 0 "register_operand" "=r,r")
-       (match_operand:SI 1 "s_operand" "+Q,S"))
+       (match_operand:SI 1 "memory_operand" "+Q,S"))
    (set (match_dup 1)
        (unspec_volatile:SI
          [(match_dup 1)
diff --git a/gcc/testsuite/gcc.target/s390/pr81534.c 
b/gcc/testsuite/gcc.target/s390/pr81534.c
new file mode 100644
index 0000000..0e1bd99
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/pr81534.c
@@ -0,0 +1,17 @@
+/* PR81534 This testcase used to fail because the HI/QI
+   "atomic_fetch_<atomic><mode>" expander accepted symbolic references
+   and emitted CAS patterns whose insn definition rejected them.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=zEC12" } */
+
+struct {
+  short b;
+  long c;
+} a = {};
+
+void
+d ()
+{
+  __atomic_fetch_add(&a.b, 0, 5);
+}
-- 
2.9.1

Reply via email to