This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/80080] S390: Isses with emitted cs-instructions for __atomic builtins.


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80080

--- Comment #9 from Andreas Krebbel <krebbel at gcc dot gnu.org> ---
Author: krebbel
Date: Tue Apr 25 07:37:50 2017
New Revision: 247132

URL: https://gcc.gnu.org/viewcvs?rev=247132&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  <vogt@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  <vogt@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:
    trunk/gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.c
    trunk/gcc/testsuite/gcc.target/s390/md/atomic_compare_exchange-1.inc
    trunk/gcc/testsuite/gcc.target/s390/md/atomic_exchange-1.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/s390/s390-protos.h
    trunk/gcc/config/s390/s390.c
    trunk/gcc/config/s390/s390.md
    trunk/gcc/testsuite/ChangeLog

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]