From 58814c7630eccb63cd24d198cfda2e8a268faa7e Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Thu, 27 Jul 2017 10:39:49 +0000 Subject: [PATCH] S/390: Fix PR81534 The HI/QI atomic_fetch_" 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 PR target/81534 * config/s390/s390.md ("*atomic_compare_and_swap_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 PR target/81534 * gcc.target/s390/pr81534.c: New test. From-SVN: r250617 --- gcc/ChangeLog | 7 +++++++ gcc/config/s390/s390.md | 6 +++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/s390/pr81534.c | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.target/s390/pr81534.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7444943bb80..ae549e7ed0d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-07-27 Andreas Krebbel + + PR target/81534 + * config/s390/s390.md ("*atomic_compare_and_swap_1") + ("*atomic_compare_and_swapdi_2", "*atomic_compare_and_swapsi_3"): + Change s_operand to memory_operand. + 2017-07-27 Richard Sandiford * config/rs6000/rs6000-protos.h (rs6000_emit_le_vsx_permute): Declare. diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 0eef9b179ee..d1ac0b8395d 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_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/ChangeLog b/gcc/testsuite/ChangeLog index fd606e03c52..cc300dc32e8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-07-27 Andreas Krebbel + + PR target/81534 + * gcc.target/s390/pr81534.c: New test. + 2017-07-27 Jakub Jelinek 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 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_" 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.30.2