public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug middle-end/64974] New: [SH] Weird expansion of 'expected' operand in atomic_compare_and_swap<mode>
@ 2015-02-08 17:29 olegendo at gcc dot gnu.org
  2015-02-10 20:48 ` [Bug middle-end/64974] " olegendo at gcc dot gnu.org
  2015-02-10 21:02 ` olegendo at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: olegendo at gcc dot gnu.org @ 2015-02-08 17:29 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 64974
           Summary: [SH] Weird expansion of 'expected' operand in
                    atomic_compare_and_swap<mode>
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: olegendo at gcc dot gnu.org
            Target: sh*-*-*

While working on PR 64661, I've noticed that the expansion of the
atomic_compare_and_swap<mode> pattern's 'expected value' operand seems to be
weird.

When compiling with -m4a -matomic-model=hard-llcs -O2, the 'expected value' and
'new value' can be immediate operands in the range -128..+127, if the atomic is
SImode.

The following example function:

void
test_0 (int* mem)
{
  int expected = 1;
  int desired = 5;
  __atomic_compare_exchange (mem, &expected, &desired, 0, __ATOMIC_ACQ_REL,
                             __ATOMIC_RELAXED);
}

is expanded to:

(insn 11 10 12 2 (parallel [
            (set (reg:SI 167)
                (unspec_volatile:SI [
                        (mem/v:SI (reg/v/f:SI 162 [ mem ]) [-1  S4 A32])
>>>>>                   (reg:SI 166)
>>>>>                   (const_int 5 [0x5])
                    ] UNSPECV_CMPXCHG_1))
            (set (mem/v:SI (reg/v/f:SI 162 [ mem ]) [-1  S4 A32])
                (unspec_volatile:SI [
                        (const_int 0 [0])
                    ] UNSPECV_CMPXCHG_2))
            (set (reg:SI 147 t)
                (unspec_volatile:SI [
                        (const_int 0 [0])
                    ] UNSPECV_CMPXCHG_3))
            (clobber (reg:SI 0 r0))
        ]) sh_tmp.cpp:9 -1
     (nil))

While the 'new value' operand is successfully passed as an immediate value, the
'expected value' is not and ends up being written onto the stack.  After
various RTL passes combine manages to plug the const_int 1 into the operand and
the stack write is eliminated.  However, the stack frame setup remains.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug middle-end/64974] [SH] Weird expansion of 'expected' operand in atomic_compare_and_swap<mode>
  2015-02-08 17:29 [Bug middle-end/64974] New: [SH] Weird expansion of 'expected' operand in atomic_compare_and_swap<mode> olegendo at gcc dot gnu.org
@ 2015-02-10 20:48 ` olegendo at gcc dot gnu.org
  2015-02-10 21:02 ` olegendo at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: olegendo at gcc dot gnu.org @ 2015-02-10 20:48 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Oleg Endo <olegendo at gcc dot gnu.org> ---
Author: olegendo
Date: Tue Feb 10 20:47:33 2015
New Revision: 220594

URL: https://gcc.gnu.org/viewcvs?rev=220594&root=gcc&view=rev
Log:
gcc/
    PR target/64661
    * config/sh/sh-protos.h (TARGET_ATOMIC_ANY, TARGET_ATOMIC_STRICT,
    TARGET_ATOMIC_SOFT_GUSA, TARGET_ATOMIC_HARD_LLCS,
    TARGET_ATOMIC_SOFT_TCB, TARGET_ATOMIC_SOFT_IMASK): Add parentheses.
    * config/sh/constraints.md (Ara, Add): New constraints.
    * config/sh/sync.md (atomic_mem_operand_0, atomic_mem_operand_1): New
    predicates.
    (atomic_compare_and_swap<mode>, atomic_exchange<mode>): Use
    atomic_mem_operand_0.  Don't use force_reg on the memory address.
    (atomic_compare_and_swapsi_hard): Use atomic_mem_operand_0 predicate and
    Sra constraint.  Convert to insn_and_split.  Add workaround for
    PR 64974.
    (atomic_compare_and_swap<mode>_hard): Copy to
    atomic_compare_and_swap<mode>_hard_1.  Convert to insn_and_split.
    Use atomic_mem_operand_0 predicate.
    (atomic_compare_and_swap<mode>_soft_gusa,
    atomic_exchange<mode>_soft_gusa): Use atomic_mem_operand_0 predicate and
    AraAdd constraints.
    (atomic_compare_and_swap<mode>_soft_tcb,
    atomic_compare_and_swap<mode>_soft_imask,
    atomic_exchange<mode>_soft_tcb, atomic_exchange<mode>_soft_imask): Use
    atomic_mem_operand_0 predicate and SraSdd constraints.
    (atomic_exchangesi_hard) Use atomic_mem_operand_0 predicate and Sra
    constraint.
    (atomic_exchange<mode>_hard): Copy to atomic_exchange<mode>_hard_1.
    Convert to insn_and_split.  Use atomic_mem_operand_0 predicate.
    (atomic_fetch_<fetchop_name><mode>, atomic_fetch_nand<mode>,
    atomic_<fetchop_name>_fetch<mode>): Use atomic_mem_operand_1.  Don't use
    force_reg on the memory address.
    (atomic_fetch_<fetchop_name>si_hard, atomic_fetch_notsi_hard,
    atomic_fetch_nandsi_hard, atomic_<fetchop_name>_fetchsi_hard,
    atomic_not_fetchsi_hard, atomic_nand_fetchsi_hard): Use
    atomic_mem_operand_1 predicate and Sra constraint.
    (atomic_fetch_<fetchop_name><mode>_hard): Copy to
    atomic_fetch_<fetchop_name><mode>_hard_1.  Convert to insn_and_split.
    Use atomic_mem_operand_1 predicate.
    (atomic_<fetchop_name><mode>_hard): Copy to
    atomic_<fetchop_name><mode>_hard_1.  Convert to insn_and_split.
    Use atomic_mem_operand_1 predicate.
    (atomic_fetch_nand<mode>_hard): Copy to atomic_fetch_nand<mode>_hard_1.
    Convert to insn_and_split.  Use atomic_mem_operand_1 predicate.
    (atomic_nand<mode>_hard): Copy to atomic_nand<mode>_hard_1.  Convert to
    insn_and_split.  Use atomic_mem_operand_1 predicate.
    (atomic_<fetchop_name>_fetch<mode>_hard): Copy to
    atomic_<fetchop_name>_fetch<mode>_hard_1.  Convert to insn_and_split.
    Use atomic_mem_operand_1 predicate.
    (atomic_nand_fetch<mode>_hard): Copy to atomic_nand_fetch<mode>_hard_1.
    Convert to insn_and_split.  Use atomic_mem_operand_1 predicate.
    (atomic_fetch_not<mode>_hard, atomic_not_fetch<mode>_hard): Replace mems
    in generated insn with original mem operand before emitting the insn.
    (atomic_fetch_<fetchop_name><mode>_soft_gusa,
    atomic_fetch_not<mode>_soft_gusa, atomic_fetch_nand<mode>_soft_gusa,
    atomic_<fetchop_name>_fetch<mode>_soft_gusa,
    atomic_not_fetch<mode>_soft_gusa, atomic_nand_fetch<mode>_soft_gusa):
    Use atomic_mem_operand_1 predicate and AraAdd constraints.
    (atomic_fetch_<fetchop_name><mode>_soft_tcb,
    atomic_<fetchop_name><mode>_soft_tcb, atomic_fetch_not<mode>_soft_tcb,
    atomic_not<mode>_soft_tcb, atomic_fetch_<fetchop_name><mode>_soft_imask,
    atomic_fetch_not<mode>_soft_imask, atomic_fetch_nand<mode>_soft_tcb,
    atomic_nand<mode>_soft_tcb, atomic_fetch_nand<mode>_soft_imask,
    atomic_<fetchop_name>_fetch<mode>_soft_tcb,
    atomic_not_fetch<mode>_soft_tcb,
    atomic_<fetchop_name>_fetch<mode>_soft_imask,
    atomic_not_fetch<mode>_soft_imask, atomic_nand_fetch<mode>,
    atomic_nand_fetch<mode>_soft_tcb, atomic_nand_fetch<mode>_soft_imask):
    Use atomic_mem_operand_1 predicate and SraSdd constraints.

gcc/testsuite/
    PR target/64661
    * gcc.taget/sh/pr64661-0.h: New.
    * gcc.taget/sh/pr64661-1.c: New.
    * gcc.taget/sh/pr64661-2.c: New.
    * gcc.taget/sh/pr64661-3.c: New.
    * gcc.taget/sh/pr64661-4.c: New.

Added:
    trunk/gcc/testsuite/gcc.target/sh/pr64661-0.h
    trunk/gcc/testsuite/gcc.target/sh/pr64661-1.c
    trunk/gcc/testsuite/gcc.target/sh/pr64661-2.c
    trunk/gcc/testsuite/gcc.target/sh/pr64661-3.c
    trunk/gcc/testsuite/gcc.target/sh/pr64661-4.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/sh/constraints.md
    trunk/gcc/config/sh/sh-protos.h
    trunk/gcc/config/sh/sync.md
    trunk/gcc/testsuite/ChangeLog


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug middle-end/64974] [SH] Weird expansion of 'expected' operand in atomic_compare_and_swap<mode>
  2015-02-08 17:29 [Bug middle-end/64974] New: [SH] Weird expansion of 'expected' operand in atomic_compare_and_swap<mode> olegendo at gcc dot gnu.org
  2015-02-10 20:48 ` [Bug middle-end/64974] " olegendo at gcc dot gnu.org
@ 2015-02-10 21:02 ` olegendo at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: olegendo at gcc dot gnu.org @ 2015-02-10 21:02 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Oleg Endo <olegendo at gcc dot gnu.org> ---
The problem got slightly worse with r220594.  The dead store to the stack frame
is not eliminated anymore.  Before the memory operands' addresses were loaded
into a reg using 'force_reg', which AFAIK dropped the memory aliasing info. 
Now that 'force_reg' is not used anymore, the dead stores remain.

I don't quite understand how those things are related.


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-02-10 21:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-08 17:29 [Bug middle-end/64974] New: [SH] Weird expansion of 'expected' operand in atomic_compare_and_swap<mode> olegendo at gcc dot gnu.org
2015-02-10 20:48 ` [Bug middle-end/64974] " olegendo at gcc dot gnu.org
2015-02-10 21:02 ` olegendo at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).