aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2020-01-17 16:53:47 -0500
committerEric Fiselier <eric@efcs.ca>2020-01-17 16:53:54 -0500
commita8a9c8e0a11abc9ed4ed78fed528334371fedf87 (patch)
tree3489c4049aa3c8f53b348db6f401fc0760ba0eb2 /clang/lib/Frontend/CompilerInvocation.cpp
parentcd40bd0a32e29fb62c89b120adbc89a847443da3 (diff)
downloadllvm-a8a9c8e0a11abc9ed4ed78fed528334371fedf87.zip
llvm-a8a9c8e0a11abc9ed4ed78fed528334371fedf87.tar.gz
llvm-a8a9c8e0a11abc9ed4ed78fed528334371fedf87.tar.bz2
[libc++] Optimize / partially inline basic_string copy constructor
Splits copy constructor up inlining short initialization, outlining long initialization into __init_long() which is the externally instantiated slow path initialization. Subsequently changing the copy ctor to be inlined (not externally instantiated) provides significant speed ups for short string initialization. Generated code given: void StringCopyCtor(void* mem, const std::string& s) { std::string*p = new(mem) std::string{s}; } asm: cmp byte ptr [rsi + 23], 0 js .LBB0_2 mov rax, qword ptr [rsi + 16] mov qword ptr [rdi + 16], rax movups xmm0, xmmword ptr [rsi] movups xmmword ptr [rdi], xmm0 ret .LBB0_2: jmp std::basic_string::__init_long # TAILCALL Benchmark: BM_StringCopy_Empty 5.19ns ± 6% 1.50ns ± 8% -71.02% (p=0.000 n=10+10) BM_StringCopy_Small 5.14ns ± 8% 1.53ns ± 7% -70.17% (p=0.000 n=10+10) BM_StringCopy_Large 18.9ns ± 0% 19.3ns ± 0% +1.92% (p=0.000 n=10+10) BM_StringCopy_Huge 309ns ± 1% 316ns ± 5% ~ (p=0.633 n=8+10) Patch from Martijn Vels (mvels@google.com) Reviewed as D72160.
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions