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).