This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug other/55981] std::atomic store is split in two smaller stores
- From: "pinskia at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 14 Jan 2013 23:08:10 +0000
- Subject: [Bug other/55981] std::atomic store is split in two smaller stores
- Auto-submitted: auto-generated
- References: <bug-55981-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55981
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-code
Target| |i?86-*-* x86_64-*-*
Status|UNCONFIRMED |NEW
Last reconfirmed| |2013-01-14
Ever Confirmed|0 |1
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> 2013-01-14 23:08:10 UTC ---
The tree level is correct:
__atomic_store_8 (&MEM[(struct __atomic_base *)&y]._M_i, 4294967298, 5);
__atomic_store_8 (&MEM[(struct __atomic_base *)&y]._M_i, 12884901892, 5);
Expansion is correct:
;; __atomic_store_8 (&MEM[(struct __atomic_base *)&y]._M_i, 4294967298, 5);
(insn 31 30 32 (set (reg:DI 84)
(const_int 4294967298 [0x100000002]))
/data1/src/gcc-cavium/toolchain/x86_64-tools/bin/../lib/gcc/x86_64-montavista-linux-gnu/4.7.0/../../../../x86_64-montavista-linux-gnu/include/c++/4.7.0/bits/atomic_base.h:438
-1
(nil))
(insn 32 31 33 (set (mem/v:DI (symbol_ref:DI ("y") [flags 0x2] <var_decl
0x7f5cdac4c0a0 y>) [-1 S8 A64])
(reg:DI 84))
/data1/src/gcc-cavium/toolchain/x86_64-tools/bin/../lib/gcc/x86_64-montavista-linux-gnu/4.7.0/../../../../x86_64-montavista-linux-gnu/include/c++/4.7.0/bits/atomic_base.h:438
-1
(nil))
(insn 33 32 0 (set (mem/v:BLK (scratch:DI) [0 A8])
(unspec:BLK [
(mem/v:BLK (scratch:DI) [0 A8])
] UNSPEC_MFENCE))
/data1/src/gcc-cavium/toolchain/x86_64-tools/bin/../lib/gcc/x86_64-montavista-linux-gnu/4.7.0/../../../../x86_64-montavista-linux-gnu/include/c++/4.7.0/bits/atomic_base.h:438
-1
(nil))
cprop3 does (though there might be cost issues):
(insn 66 30 33 3 (set (mem/v:DI (symbol_ref:DI ("y") [flags 0x2] <var_decl
0x7f5cdac4c0a0 y>) [-1 S8 A64])
(const_int 4294967298 [0x100000002]))
/data1/src/gcc-cavium/toolchain/x86_64-tools/bin/../lib/gcc/x86_64-montavista-linux-gnu/4.7.0/../../../../x86_64-montavista-linux-gnu/include/c++/4.7.0/bits/atomic_base.h:438
62 {*movdi_internal_rex64}
(nil))
(insn 33 66 35 3 (set (mem/v:BLK (scratch:DI) [0 A8])
(unspec:BLK [
(mem/v:BLK (scratch:DI) [0 A8])
] UNSPEC_MFENCE))
/data1/src/gcc-cavium/toolchain/x86_64-tools/bin/../lib/gcc/x86_64-montavista-linux-gnu/4.7.0/../../../../x86_64-montavista-linux-gnu/include/c++/4.7.0/bits/atomic_base.h:438
2052 {mfence_sse2}
(nil))
peephole2 then comes around and does the splitting of the atomic instruction so
this is a target issue.