<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jun 3, 2014 at 9:23 PM, Dennis Luehring <span dir="ltr"><<a href="mailto:dl.soluz@gmx.net" target="_blank">dl.soluz@gmx.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Am 04.06.2014 00:16, schrieb Richard Smith:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class="">
>The standard (as of only a few months ago) allows operator new/operator<br></div>
>delete calls such as the above to be removed, but*only* Â if they came from<div class=""><br>
>new-expressions and delete-expressions. Under the covers, std::vector uses<br>
>direct calls to ::operator new and ::operator delete, so these provisions<br>
>do not apply.<br>
><br>
>So... we should add some way for std::allocator to say<br>
>"allocate/deallocate memory like a new-expression", and use it in libc++. I<br>
>think we should add<br>
><br>
> Â  void *__builtin_operator_new(size_<u></u>t)<br>
> Â  void __builtin_operator_delete(<u></u>void*)<br>
><br>
>for this.<br>
><br>
</div></blockquote><div class="">
Clang now supports these, and I have a patch out for review to make libc++<br>
use them. With the patch applied, clang+libc++ optimizes your code down to<br>
just 'return 160' for both the std::array and std::vector cases.<br>
<br>
</div></blockquote>
<br>
unbelievably fast integration :) - thanks alot for taking the time<br>
<br>
how well does your patch play with<br>
<br>
gcc.<a href="http://gcc.godbolt.org" target="_blank">http://gcc.godbolt.org</a>, clang version 3.4.1 -O3 -std=c++11<br>
<br>
#include <string><br>
int main()<br>
{<br>
  return std::string("hello").size();<br>
}<br>
<br>
results in:</blockquote><div><br></div><div><div>main: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # @main</div><div>  Â  Â  Â  movl Â  Â $5, %eax<br></div><div>  Â  Â  Â  retq</div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class="">
main: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # @main<br>
  Â  pushq Â  Â %rbx<br></div>
  Â  subq Â  Â $32, %rsp<br>
  Â  leaq Â  Â 16(%rsp), %rdi<br>
  Â  leaq Â  Â 8(%rsp), %rdx<br>
  Â  movl Â  Â $.L.str, %esi<br>
  Â  callq Â  Â std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)<br>
  Â  movq Â  Â 16(%rsp), %rax<br>
  Â  leaq Â  Â -24(%rax), %rdi<br>
  Â  movl Â  Â std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage, %ecx<br>
  Â  cmpq Â  Â %rcx, %rdi<br>
  Â  movl Â  Â -24(%rax), %ebx<br>
  Â  jne Â  Â .LBB0_1<br>
.LBB0_6: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â # %_ZNSsD1Ev.exit<br>
  Â  movl Â  Â %ebx, %eax<br>
  Â  addq Â  Â $32, %rsp<br>
  Â  popq Â  Â %rbx<br>
  Â  ret<br>
.LBB0_1:<br>
  Â  addq Â  Â $-8, %rax<br>
  Â  movl Â  Â $__pthread_key_create, %ecx<br>
  Â  testq Â  Â %rcx, %rcx<br>
  Â  je Â  Â .LBB0_3<br>
  Â  movl Â  Â $-1, %ecx<br>
  Â  lock<br>
  Â  xaddl Â  Â %ecx, (%rax)<br>
  Â  movl Â  Â %ecx, 28(%rsp)<br>
  Â  movl Â  Â 28(%rsp), %ecx<br>
  Â  jmp Â  Â .LBB0_4<br>
.LBB0_3:<br>
  Â  movl Â  Â (%rax), %ecx<br>
  Â  leal Â  Â -1(%rcx), %edx<br>
  Â  movl Â  Â %edx, (%rax)<br>
.LBB0_4: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â # %_ZN9__gnu_cxxL27__exchange_<u></u>and_add_dispatchEPii.exit.i.i.<u></u>i<br>
  Â  testl Â  Â %ecx, %ecx<br>
  Â  jg Â  Â .LBB0_6<br>
  Â  leaq Â  Â 24(%rsp), %rsi<br>
  Â  callq Â  Â std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_M_destroy(std::<u></u>allocator<char> const&)<br>
  Â  jmp Â  Â .LBB0_6<br>
<br>
.L.str:<br>
  Â  .asciz Â  Â "hello"<br>
<br>
and<br>
<br>
#include <vector><br>
#include <numeric><div class=""><br>
<br>
typedef std::vector<int> container_t;<br>
<br></div>
int main()<br>
{<div class=""><br>
  const container_t a{1,2};<br>
  const container_t b{4,5};<br>
  const container_t ints<br>
  {<br>
  Â  std::accumulate(a.begin(),a.<u></u>end(),1),<br>
  Â  std::accumulate(b.begin(),b.<u></u>end(),2),<br>
  };<br></div>
  return std::accumulate(ints.begin(),<u></u>ints.end(),100);<br>
}<br>
<br>
results in:<br></blockquote><div><br></div><div><div>main: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # @main</div><div>  Â  Â  Â  movl Â  Â $115, %eax<br></div><div>  Â  Â  Â  retq</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

main: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # @main<br>
  Â  pushq Â  Â %rbp<br>
  Â  pushq Â  Â %r15<br>
  Â  pushq Â  Â %r14<br>
  Â  pushq Â  Â %rbx<br>
  Â  pushq Â  Â %rax<br>
  Â  movl Â  Â $8, %edi<br>
  Â  callq Â  Â operator new(unsigned long)<br>
  Â  movq Â  Â %rax, %r14<br>
  Â  movabsq Â  Â $8589934593, %rax Â  Â  Â  # imm = 0x200000001<br>
  Â  movq Â  Â %rax, (%r14)<br>
  Â  movl Â  Â $8, %edi<br>
  Â  callq Â  Â operator new(unsigned long)<br>
  Â  movq Â  Â %rax, %rbx<br>
  Â  movabsq Â  Â $21474836484, %rax Â  Â  Â # imm = 0x500000004<br>
  Â  movq Â  Â %rax, (%rbx)<br>
  Â  movl Â  Â (%r14), %r15d<br>
  Â  movl Â  Â 4(%r14), %ebp<br>
  Â  movl Â  Â $8, %edi<br>
  Â  callq Â  Â operator new(unsigned long)<br>
  Â  leal Â  Â 1(%r15,%rbp), %ebp<br>
  Â  testq Â  Â %rax, %rax<br>
  Â  movl Â  Â %ebp, (%rax)<br>
  Â  movl Â  Â $11, 4(%rax)<br>
  Â  je Â  Â .LBB0_5<div class=""><br>
  Â  movq Â  Â %rax, %rdi<br>
  Â  callq Â  Â operator delete(void*)<br></div>
.LBB0_5: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â # %_ZNSt6vectorIiSaIiEED2Ev.<u></u>exit25<br>
  Â  testq Â  Â %rbx, %rbx<br>
  Â  je Â  Â .LBB0_7<br>
  Â  movq Â  Â %rbx, %rdi<br>
  Â  callq Â  Â operator delete(void*)<br>
.LBB0_7: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â # %_ZNSt6vectorIiSaIiEED2Ev.<u></u>exit23<br>
  Â  addl Â  Â $111, %ebp<br>
  Â  testq Â  Â %r14, %r14<br>
  Â  je Â  Â .LBB0_9<br>
  Â  movq Â  Â %r14, %rdi<br>
  Â  callq Â  Â operator delete(void*)<br>
.LBB0_9: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â # %_ZNSt6vectorIiSaIiEED2Ev.<u></u>exit21<br>
  Â  movl Â  Â %ebp, %eax<br>
  Â  addq Â  Â $8, %rsp<br>
  Â  popq Â  Â %rbx<br>
  Â  popq Â  Â %r14<br>
  Â  popq Â  Â %r15<br>
  Â  popq Â  Â %rbp<br>
  Â  ret<br>
  Â  movq Â  Â %rax, %rbp<br>
  Â  movq Â  Â %rbp, %rdi<br>
  Â  callq Â  Â _Unwind_Resume<br>
  Â  movq Â  Â %rax, %rbp<br>
  Â  jmp Â  Â .LBB0_14<br>
  Â  movq Â  Â %rax, %rbp<br>
  Â  testq Â  Â %rbx, %rbx<br>
  Â  je Â  Â .LBB0_14<br>
  Â  movq Â  Â %rbx, %rdi<br>
  Â  callq Â  Â operator delete(void*)<br>
.LBB0_14: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # %_ZNSt6vectorIiSaIiEED2Ev.<u></u>exit15<br>
  Â  testq Â  Â %r14, %r14<br>
  Â  je Â  Â .LBB0_16<br>
  Â  movq Â  Â %r14, %rdi<br>
  Â  callq Â  Â operator delete(void*)<br>
.LBB0_16: Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # %_ZNSt6vectorIiSaIiEED2Ev.exit<br>
  Â  movq Â  Â %rbp, %rdi<br>
  Â  callq Â  Â _Unwind_Resume<br>
GCC_except_table0:<br>
  Â  .byte Â  Â 255 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # @LPStart Encoding = omit<br>
  Â  .byte Â  Â 3 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # @TType Encoding = udata4<br>
  Â  .asciz Â  Â "\266\200\200" Â  Â  Â  Â  Â # @TType base offset<br>
  Â  .byte Â  Â 3 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # Call site Encoding = udata4<br>
  Â  .byte Â  Â 52 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â # Call site table length<br>
  Â  .long Â  Â .Lset0<br>
  Â  .long Â  Â .Lset1<br>
  Â  .long Â  Â .Lset2<br>
  Â  .byte Â  Â 0 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # Â  On action: cleanup<br>
  Â  .long Â  Â .Lset3<br>
  Â  .long Â  Â .Lset4<br>
  Â  .long Â  Â .Lset5<br>
  Â  .byte Â  Â 0 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # Â  On action: cleanup<br>
  Â  .long Â  Â .Lset6<br>
  Â  .long Â  Â .Lset7<br>
  Â  .long Â  Â .Lset8<br>
  Â  .byte Â  Â 0 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # Â  On action: cleanup<br>
  Â  .long Â  Â .Lset9<br>
  Â  .long Â  Â .Lset10<br>
  Â  .long Â  Â 0 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # Â  Â  has no landing pad<br>
  Â  .byte Â  Â 0 Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  # Â  On action: cleanup<div class=""><div class="h5"><br>
<br>
<br>
<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div></div>