[Bug middle-end/63273] New: atomic operations lead to inefficient code
dvyukov at google dot com
gcc-bugzilla@gcc.gnu.org
Tue Sep 16 01:23:00 GMT 2014
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
More information about the Gcc-bugs
mailing list