From: Andreas Krebbel Date: Thu, 27 Jul 2017 10:39:49 +0000 (+0000) Subject: S/390: Fix PR81534 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=58814c7630eccb63cd24d198cfda2e8a268faa7e;p=gcc.git 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 --- 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); +}