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 other/55981] std::atomic store is split in two smaller stores


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.


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