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

            Bug ID: 63273
           Summary: atomic operations lead to inefficient code
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dvyukov at google dot com

Created attachment 33498
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=33498&action=edit
reproducer

gcc version 5.0.0 20140830 (experimental) (GCC)

Build the attached reproducer as:
$ g++ atomic.cc -std=c++11 -O3

Then disassemble the output. I would expect that all of test_nonatomic,
test_atomicops (hand rolled implementation of atomic operations), test_std and
test_intrinsic lead to generation of the same code. However, test_std and
test_intrinsic lead to generation of vastly inefficient code with lots of
unnecessary spills.

00000000004008a0 <_Z14test_nonatomicv>:
  4008a0:    mov    0x200b82(%rip),%eax        # 601428 <a>
  4008a6:    addl   $0x1,0x200b2b(%rip)        # 6013d8 <x>
  4008ad:    add    $0x1,%eax
  4008b0:    mov    %eax,0x200b72(%rip)        # 601428 <a>
  4008b6:    mov    0x200b68(%rip),%eax        # 601424 <b>
  4008bc:    add    $0x1,%eax
  4008bf:    mov    %eax,0x200b5f(%rip)        # 601424 <b>
  4008c5:    mov    0x200b55(%rip),%eax        # 601420 <c>
  4008cb:    add    $0x1,%eax
  4008ce:    mov    %eax,0x200b4c(%rip)        # 601420 <c>
  4008d4:    mov    0x200b42(%rip),%eax        # 60141c <d>
  4008da:    add    $0x1,%eax
  4008dd:    mov    %eax,0x200b39(%rip)        # 60141c <d>
  4008e3:    mov    0x200b2f(%rip),%eax        # 601418 <e>
  4008e9:    add    $0x1,%eax
  4008ec:    mov    %eax,0x200b26(%rip)        # 601418 <e>
  4008f2:    mov    0x200b1c(%rip),%eax        # 601414 <f>
  4008f8:    add    $0x1,%eax
  4008fb:    mov    %eax,0x200b13(%rip)        # 601414 <f>
  400901:    mov    0x200b09(%rip),%eax        # 601410 <g>
  400907:    add    $0x1,%eax
  40090a:    mov    %eax,0x200b00(%rip)        # 601410 <g>
  400910:    mov    0x200af6(%rip),%eax        # 60140c <h>
  400916:    add    $0x1,%eax
  400919:    mov    %eax,0x200aed(%rip)        # 60140c <h>
  40091f:    retq   

0000000000400920 <_Z14test_atomicopsv>:
  400920:    mov    0x200ab2(%rip),%eax        # 6013d8 <x>
  400926:    add    $0x1,%eax
  400929:    mov    %eax,0x200aa9(%rip)        # 6013d8 <x>
  40092f:    mov    0x200af3(%rip),%eax        # 601428 <a>
  400935:    add    $0x1,%eax
  400938:    mov    %eax,0x200aea(%rip)        # 601428 <a>
  40093e:    mov    0x200ae0(%rip),%eax        # 601424 <b>
  400944:    add    $0x1,%eax
  400947:    mov    %eax,0x200ad7(%rip)        # 601424 <b>
  40094d:    mov    0x200acd(%rip),%eax        # 601420 <c>
  400953:    add    $0x1,%eax
  400956:    mov    %eax,0x200ac4(%rip)        # 601420 <c>
  40095c:    mov    0x200aba(%rip),%eax        # 60141c <d>
  400962:    add    $0x1,%eax
  400965:    mov    %eax,0x200ab1(%rip)        # 60141c <d>
  40096b:    mov    0x200aa7(%rip),%eax        # 601418 <e>
  400971:    add    $0x1,%eax
  400974:    mov    %eax,0x200a9e(%rip)        # 601418 <e>
  40097a:    mov    0x200a94(%rip),%eax        # 601414 <f>
  400980:    add    $0x1,%eax
  400983:    mov    %eax,0x200a8b(%rip)        # 601414 <f>
  400989:    mov    0x200a81(%rip),%eax        # 601410 <g>
  40098f:    add    $0x1,%eax
  400992:    mov    %eax,0x200a78(%rip)        # 601410 <g>
  400998:    mov    0x200a6e(%rip),%eax        # 60140c <h>
  40099e:    add    $0x1,%eax
  4009a1:    mov    %eax,0x200a65(%rip)        # 60140c <h>
  4009a7:    retq   
  4009a8:    nopl   0x0(%rax,%rax,1)

00000000004009b0 <_Z8test_stdv>:
  4009b0:    push   %r15
  4009b2:    mov    0x200a57(%rip),%r8d        # 601410 <g>
  4009b9:    push   %r14
  4009bb:    mov    0x200a4a(%rip),%r9d        # 60140c <h>
  4009c2:    push   %r13
  4009c4:    mov    0x200a25(%rip),%r10d        # 6013f0 <g1>
  4009cb:    push   %r12
  4009cd:    mov    0x200a18(%rip),%r11d        # 6013ec <h1>
  4009d4:    push   %rbp
  4009d5:    mov    0x200a39(%rip),%edi        # 601414 <f>
  4009db:    push   %rbx
  4009dc:    mov    0x200a36(%rip),%ebx        # 601418 <e>
  4009e2:    mov    0x200a1f(%rip),%r15d        # 601408 <a1>
  4009e9:    mov    0x200a14(%rip),%r14d        # 601404 <b1>
  4009f0:    mov    %r8d,-0x10(%rsp)
  4009f5:    mov    %r9d,-0xc(%rsp)
  4009fa:    mov    %ebx,-0x18(%rsp)
  4009fe:    mov    %r10d,-0x8(%rsp)
  400a03:    mov    %r11d,-0x4(%rsp)
  400a08:    mov    %edi,-0x14(%rsp)
  400a0c:    mov    0x2009ed(%rip),%r13d        # 601400 <c1>
  400a13:    mov    0x2009e2(%rip),%r12d        # 6013fc <d1>
  400a1a:    mov    0x2009d8(%rip),%ebp        # 6013f8 <e1>
  400a20:    mov    0x2009ce(%rip),%ebx        # 6013f4 <f1>
  400a26:    mov    0x2009fc(%rip),%esi        # 601428 <a>
  400a2c:    mov    0x2009f2(%rip),%ecx        # 601424 <b>
  400a32:    mov    0x2009e8(%rip),%edx        # 601420 <c>
  400a38:    mov    0x2009de(%rip),%eax        # 60141c <d>
  400a3e:    mov    0x2009a3(%rip),%r11d        # 6013e8 <a2>
  400a45:    mov    0x200998(%rip),%r10d        # 6013e4 <b2>
  400a4c:    mov    0x20098d(%rip),%r9d        # 6013e0 <c2>
  400a53:    mov    0x200982(%rip),%r8d        # 6013dc <d2>
  400a5a:    add    $0x1,%esi
  400a5d:    mov    0x200971(%rip),%edi        # 6013d4 <std_x>
  400a63:    add    $0x1,%eax
  400a66:    add    $0x1,%ecx
  400a69:    add    $0x1,%edx
  400a6c:    add    $0x1,%edi
  400a6f:    mov    %edi,0x20095f(%rip)        # 6013d4 <std_x>
  400a75:    mov    %eax,0x2009a1(%rip)        # 60141c <d>
  400a7b:    mov    -0x18(%rsp),%eax
  400a7f:    mov    -0x14(%rsp),%edi
  400a83:    mov    %r15d,0x20097e(%rip)        # 601408 <a1>
  400a8a:    mov    %r14d,0x200973(%rip)        # 601404 <b1>
  400a91:    mov    %r13d,0x200968(%rip)        # 601400 <c1>
  400a98:    add    $0x1,%eax
  400a9b:    mov    %r12d,0x20095a(%rip)        # 6013fc <d1>
  400aa2:    mov    %ebp,0x200950(%rip)        # 6013f8 <e1>
  400aa8:    mov    %eax,0x20096a(%rip)        # 601418 <e>
  400aae:    lea    0x1(%rdi),%eax
  400ab1:    mov    %ebx,0x20093d(%rip)        # 6013f4 <f1>
  400ab7:    mov    %esi,0x20096b(%rip)        # 601428 <a>
  400abd:    mov    %ecx,0x200961(%rip)        # 601424 <b>
  400ac3:    mov    %eax,0x20094b(%rip)        # 601414 <f>
  400ac9:    mov    -0x10(%rsp),%eax
  400acd:    mov    %edx,0x20094d(%rip)        # 601420 <c>
  400ad3:    mov    %r11d,0x20090e(%rip)        # 6013e8 <a2>
  400ada:    mov    %r10d,0x200903(%rip)        # 6013e4 <b2>
  400ae1:    mov    %r9d,0x2008f8(%rip)        # 6013e0 <c2>
  400ae8:    add    $0x1,%eax
  400aeb:    mov    %r8d,0x2008ea(%rip)        # 6013dc <d2>
  400af2:    mov    %eax,0x200918(%rip)        # 601410 <g>
  400af8:    mov    -0xc(%rsp),%eax
  400afc:    add    $0x1,%eax
  400aff:    mov    %eax,0x200907(%rip)        # 60140c <h>
  400b05:    mov    -0x8(%rsp),%eax
  400b09:    mov    %eax,0x2008e1(%rip)        # 6013f0 <g1>
  400b0f:    mov    -0x4(%rsp),%eax
  400b13:    pop    %rbx
  400b14:    pop    %rbp
  400b15:    mov    %eax,0x2008d1(%rip)        # 6013ec <h1>
  400b1b:    pop    %r12
  400b1d:    pop    %r13
  400b1f:    pop    %r14
  400b21:    pop    %r15
  400b23:    retq   
  400b24:    data32 data32 nopw %cs:0x0(%rax,%rax,1)

0000000000400b30 <_Z14test_intrinsicv>:
  400b30:    push   %r15
  400b32:    mov    0x2008d7(%rip),%r8d        # 601410 <g>
  400b39:    push   %r14
  400b3b:    mov    0x2008ca(%rip),%r9d        # 60140c <h>
  400b42:    push   %r13
  400b44:    mov    0x2008a5(%rip),%r10d        # 6013f0 <g1>
  400b4b:    push   %r12
  400b4d:    mov    0x200898(%rip),%r11d        # 6013ec <h1>
  400b54:    push   %rbp
  400b55:    mov    0x2008b9(%rip),%edi        # 601414 <f>
  400b5b:    push   %rbx
  400b5c:    mov    0x2008b6(%rip),%ebx        # 601418 <e>
  400b62:    mov    0x20089f(%rip),%r15d        # 601408 <a1>
  400b69:    mov    0x200894(%rip),%r14d        # 601404 <b1>
  400b70:    mov    %r8d,-0x10(%rsp)
  400b75:    mov    %r9d,-0xc(%rsp)
  400b7a:    mov    %ebx,-0x18(%rsp)
  400b7e:    mov    %r10d,-0x8(%rsp)
  400b83:    mov    %r11d,-0x4(%rsp)
  400b88:    mov    %edi,-0x14(%rsp)
  400b8c:    mov    0x20086d(%rip),%r13d        # 601400 <c1>
  400b93:    mov    0x200862(%rip),%r12d        # 6013fc <d1>
  400b9a:    mov    0x200858(%rip),%ebp        # 6013f8 <e1>
  400ba0:    mov    0x20084e(%rip),%ebx        # 6013f4 <f1>
  400ba6:    mov    0x20087c(%rip),%esi        # 601428 <a>
  400bac:    mov    0x200872(%rip),%ecx        # 601424 <b>
  400bb2:    mov    0x200868(%rip),%edx        # 601420 <c>
  400bb8:    mov    0x20085e(%rip),%eax        # 60141c <d>
  400bbe:    mov    0x200823(%rip),%r11d        # 6013e8 <a2>
  400bc5:    mov    0x200818(%rip),%r10d        # 6013e4 <b2>
  400bcc:    mov    0x20080d(%rip),%r9d        # 6013e0 <c2>
  400bd3:    mov    0x200802(%rip),%r8d        # 6013dc <d2>
  400bda:    add    $0x1,%esi
  400bdd:    mov    0x2007f5(%rip),%edi        # 6013d8 <x>
  400be3:    add    $0x1,%eax
  400be6:    add    $0x1,%ecx
  400be9:    add    $0x1,%edx
  400bec:    add    $0x1,%edi
  400bef:    mov    %edi,0x2007e3(%rip)        # 6013d8 <x>
  400bf5:    mov    %eax,0x200821(%rip)        # 60141c <d>
  400bfb:    mov    -0x18(%rsp),%eax
  400bff:    mov    -0x14(%rsp),%edi
  400c03:    mov    %r15d,0x2007fe(%rip)        # 601408 <a1>
  400c0a:    mov    %r14d,0x2007f3(%rip)        # 601404 <b1>
  400c11:    mov    %r13d,0x2007e8(%rip)        # 601400 <c1>
  400c18:    add    $0x1,%eax
  400c1b:    mov    %r12d,0x2007da(%rip)        # 6013fc <d1>
  400c22:    mov    %ebp,0x2007d0(%rip)        # 6013f8 <e1>
  400c28:    mov    %eax,0x2007ea(%rip)        # 601418 <e>
  400c2e:    lea    0x1(%rdi),%eax
  400c31:    mov    %ebx,0x2007bd(%rip)        # 6013f4 <f1>
  400c37:    mov    %esi,0x2007eb(%rip)        # 601428 <a>
  400c3d:    mov    %ecx,0x2007e1(%rip)        # 601424 <b>
  400c43:    mov    %eax,0x2007cb(%rip)        # 601414 <f>
  400c49:    mov    -0x10(%rsp),%eax
  400c4d:    mov    %edx,0x2007cd(%rip)        # 601420 <c>
  400c53:    mov    %r11d,0x20078e(%rip)        # 6013e8 <a2>
  400c5a:    mov    %r10d,0x200783(%rip)        # 6013e4 <b2>
  400c61:    mov    %r9d,0x200778(%rip)        # 6013e0 <c2>
  400c68:    add    $0x1,%eax
  400c6b:    mov    %r8d,0x20076a(%rip)        # 6013dc <d2>
  400c72:    mov    %eax,0x200798(%rip)        # 601410 <g>
  400c78:    mov    -0xc(%rsp),%eax
  400c7c:    add    $0x1,%eax
  400c7f:    mov    %eax,0x200787(%rip)        # 60140c <h>
  400c85:    mov    -0x8(%rsp),%eax
  400c89:    mov    %eax,0x200761(%rip)        # 6013f0 <g1>
  400c8f:    mov    -0x4(%rsp),%eax
  400c93:    pop    %rbx
  400c94:    pop    %rbp
  400c95:    mov    %eax,0x200751(%rip)        # 6013ec <h1>
  400c9b:    pop    %r12
  400c9d:    pop    %r13
  400c9f:    pop    %r14
  400ca1:    pop    %r15
  400ca3:    retq

Reply via email to