summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-27 10:42:22 +0000
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-27 10:42:22 +0000
commit3207166aab2481f1ad32b6cdf8ed8e9e50fe14fb (patch)
treec21ebcd18b72f866b73d758d67edeb192790d707
parentef82cd98fcd583725cf66468c3312ea0128bdf7c (diff)
downloadgcc-3207166aab2481f1ad32b6cdf8ed8e9e50fe14fb.tar.gz
S/390: Fix PR81534
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> Backport from mainline 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> Backport from mainline 2017-07-27 Andreas Krebbel <krebbel@linux.vnet.ibm.com> PR target/81534 * gcc.target/s390/pr81534.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@250618 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/s390/s390.md6
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/s390/pr81534.c17
4 files changed, 38 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4b052b31f05..70d48556127 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2017-07-27 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ Backport from mainline
+ 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 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/81555
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index cfae171c2a0..7b6d09bcb41 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -10280,7 +10280,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)
@@ -10298,7 +10298,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)
@@ -10319,7 +10319,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/ChangeLog b/gcc/testsuite/ChangeLog
index bd2d32b645f..be732b19ce4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2017-07-27 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ Backport from mainline
+ 2017-07-27 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
+
+ PR target/81534
+ * gcc.target/s390/pr81534.c: New test.
+
2017-07-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/71570
diff --git a/gcc/testsuite/gcc.target/s390/pr81534.c b/gcc/testsuite/gcc.target/s390/pr81534.c
new file mode 100644
index 00000000000..0e1bd99b9cb
--- /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);
+}