https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80080
--- Comment #10 from Andreas Krebbel <krebbel at gcc dot gnu.org> --- Author: krebbel Date: Tue Apr 25 11:11:48 2017 New Revision: 247189 URL: https://gcc.gnu.org/viewcvs?rev=247189&root=gcc&view=rev Log: S/390: PR80080: Optimize atomic patterns. The attached patch optimizes the atomic_exchange and atomic_compare patterns on s390 and s390x (mostly limited to SImode and DImode). Among general optimizaation, the changes fix most of the problems reported in PR 80080: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80080 gcc/ChangeLog: 2017-04-25 Dominik Vogt <v...@linux.vnet.ibm.com> Backport from mainline 2017-04-25 Dominik Vogt <v...@linux.vnet.ibm.com> PR target/80080 * s390-protos.h (s390_expand_cs_hqi): Removed. (s390_expand_cs, s390_expand_atomic_exchange_tdsi): New prototypes. * config/s390/s390.c (s390_emit_compare_and_swap): Handle all integer modes as well as CCZ1mode and CCZmode. (s390_expand_atomic_exchange_tdsi, s390_expand_atomic): Adapt to new signature of s390_emit_compare_and_swap. (s390_expand_cs_hqi): Likewise, make static. (s390_expand_cs_tdsi): Generate an explicit compare before trying compare-and-swap, in some cases. (s390_expand_cs): Wrapper function. (s390_expand_atomic_exchange_tdsi): New backend specific expander for atomic_exchange. (s390_match_ccmode_set): Allow CCZmode <-> CCZ1 mode. * config/s390/s390.md ("atomic_compare_and_swap<mode>"): Merge the patterns for small and large integers. Forbid symref memory operands. Move expander to s390.c. Require cc register. ("atomic_compare_and_swap<DGPR:mode><CCZZ1:mode>_internal") ("*atomic_compare_and_swap<TDI:mode><CCZZ1:mode>_1") ("*atomic_compare_and_swapdi<CCZZ1:mode>_2") ("*atomic_compare_and_swapsi<CCZZ1:mode>_3"): Use s_operand to forbid symref memory operands. Remove CC mode and call s390_match_ccmode instead. ("atomic_exchange<mode>"): Allow and implement all integer modes. gcc/testsuite/ChangeLog: 2017-04-25 Dominik Vogt <v...@linux.vnet.ibm.com> Backport from mainline 2017-04-25 Dominik Vogt <v...@linux.vnet.ibm.com> PR target/80080 * gcc.target/s390/md/atomic_compare_exchange-1.c: New test. * gcc.target/s390/md/atomic_compare_exchange-1.inc: New test. * gcc.target/s390/md/atomic_exchange-1.inc: New test. Added: branches/gcc-7-branch/gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.c branches/gcc-7-branch/gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.inc branches/gcc-7-branch/gcc/testsuite/gcc.target/s390/md/atomic_exchange-1.c Modified: branches/gcc-7-branch/gcc/ChangeLog branches/gcc-7-branch/gcc/config/s390/s390-protos.h branches/gcc-7-branch/gcc/config/s390/s390.c branches/gcc-7-branch/gcc/config/s390/s390.md branches/gcc-7-branch/gcc/testsuite/ChangeLog