S/390: Fix PR81534
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Thu, 27 Jul 2017 10:39:49 +0000 (10:39 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Thu, 27 Jul 2017 10:39:49 +0000 (10:39 +0000)
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.

gcc/ChangeLog:

2017-07-27  Andreas Krebbel  <krebbel@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  <krebbel@linux.vnet.ibm.com>

PR target/81534
* gcc.target/s390/pr81534.c: New test.

From-SVN: r250617

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

index 7444943bb80929e55a8ce5cf93c8f7bc47b6b93b..ae549e7ed0d4f89ae5224bc6d3a774e89113be4f 100644 (file)
@@ -1,3 +1,10 @@
+2017-07-27  Andreas Krebbel  <krebbel@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.
+
 2017-07-27  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * config/rs6000/rs6000-protos.h (rs6000_emit_le_vsx_permute): Declare.
index 0eef9b179ee0ea7feeb4ff91ec4e020f50e5cd68..d1ac0b8395da3bd08a8bb8cb471fee62e579d6d0 100644 (file)
 ; 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)
 ; 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)
 ; 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)
index fd606e03c529eaad73408575c1fa60b27494ad1d..cc300dc32e8901499876767b979685b729bc8bc0 100644 (file)
@@ -1,3 +1,8 @@
+2017-07-27  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
+
+       PR target/81534
+       * gcc.target/s390/pr81534.c: New test.
+
 2017-07-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/81555
diff --git a/gcc/testsuite/gcc.target/s390/pr81534.c b/gcc/testsuite/gcc.target/s390/pr81534.c
new file mode 100644 (file)
index 0000000..0e1bd99
--- /dev/null
@@ -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);
+}