[LLVMdev] Explicit template instantiations in libc++
Justin Bogner
mail at justinbogner.com
Thu Aug 14 10:48:45 PDT 2014
Sean Silva <chisophugis at gmail.com> writes:
> Given the dates, this seems unrelated, but there have been
> compile-time issues with libc++ for some time now:
> http://llvm.org/bugs/show_bug.cgi?id=14587
Restoring these explicit instantiations will certainly help, but it
sounds like that PR is a bit more involved.
I ran some LNT numbers for posterity, and there are *many* compile time
improvements of 5-10% in our test suite, and no compile regressions.
Performance Improvements - Compile Time Δ Previous Current σ
SingleSource/Benchmarks/Shootout-C++/strcat -11.50% 0.6436 0.5696 0.0005
SingleSource/Benchmarks/Misc-C++/bigfib -10.70% 1.1776 1.0516 0.0021
SingleSource/UnitTests/Vectorizer/gcc-loops -8.79% 0.9554 0.8714 0.0032
SingleSource/Benchmarks/Shootout-C++/matrix -8.08% 0.6670 0.6131 0.0010
SingleSource/Benchmarks/Shootout-C++/EH/except -7.94% 0.6474 0.5960 0.0027
SingleSource/Benchmarks/Shootout-C++/ackermann -7.26% 0.6377 0.5914 0.0012
MultiSource/Benchmarks/Prolangs-C++/employ/employ -7.07% 0.7394 0.6871 0.0026
SingleSource/Benchmarks/Shootout-C++/methcall -6.97% 0.6444 0.5995 0.0040
SingleSource/Benchmarks/Shootout-C++/lists1 -6.94% 0.7980 0.7426 0.0032
SingleSource/Benchmarks/Shootout-C++/ary3 -6.93% 0.7299 0.6793 0.0018
SingleSource/Benchmarks/Shootout-C++/objinst -6.91% 0.6517 0.6067 0.0021
SingleSource/Benchmarks/Misc-C++/Large/sphereflake -6.56% 0.7693 0.7188 0.0045
MultiSource/Benchmarks/Prolangs-C++/city/city -6.18% 4.5336 4.2535 0.0053
SingleSource/Benchmarks/Shootout-C++/sieve -6.06% 0.8268 0.7767 0.0014
SingleSource/Benchmarks/Adobe-C++/functionobjects -5.90% 0.4964 0.4671 0.0005
SingleSource/Benchmarks/Shootout-C++/ary2 -5.86% 0.6929 0.6523 0.0013
SingleSource/Benchmarks/Shootout-C++/nestedloop -5.81% 0.5985 0.5637 0.0009
SingleSource/Benchmarks/Shootout-C++/fibo -5.75% 0.5913 0.5573 0.0017
SingleSource/Benchmarks/Shootout-C++/random -5.63% 0.6007 0.5669 0.0005
SingleSource/Benchmarks/Shootout-C++/hash2 -5.52% 0.9050 0.8550 0.0013
SingleSource/Benchmarks/Misc-C++/Large/ray -5.40% 0.8162 0.7721 0.0007
SingleSource/Benchmarks/CoyoteBench/fftbench -5.28% 0.8547 0.8096 0.0008
External/SPEC/CFP2006/450_soplex/450_soplex -4.91% 48.1568 45.7941 0.0032
SingleSource/Benchmarks/Shootout-C++/lists -4.64% 0.7248 0.6912 0.0024
SingleSource/Benchmarks/Shootout-C++/ary -4.63% 0.6829 0.6513 0.0004
MultiSource/Applications/hexxagon/hexxagon -3.80% 2.1581 2.0760 0.0049
SingleSource/Benchmarks/Shootout-C++/hash -3.71% 0.8454 0.8140 0.0012
MultiSource/Applications/kimwitu++/kc -3.03% 18.1397 17.5900 0.0186
SingleSource/Benchmarks/Misc-C++/stepanov_container -2.49% 1.4438 1.4079 0.0010
MultiSource/Benchmarks/tramp3d-v4/tramp3d-v4 -1.67% 24.2177 23.8125 0.0248
External/SPEC/CINT2006/471_omnetpp/471_omnetpp -1.33% 54.8197 54.0908 0.0226
>
> -- Sean Silva
>
> On Tue, Aug 12, 2014 at 2:17 PM, Justin Bogner <mail at justinbogner.com> wrote:
>
> Most of libc++ doesn't have explicit template instantiations, which
> leads to a pretty significant build time and code size cost when using
> libc++, since a large number of common templates will be emitted by the
> compiler and coalesced by the linker. Notably, in include/__config, we
> have:
>
> #ifndef _LIBCPP_EXTERN_TEMPLATE
> #define _LIBCPP_EXTERN_TEMPLATE(...)
> #endif
>
> whereas before r189601 this was:
>
> #define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
>
> This was apparently done to fix http://llvm.org/bugs/show_bug.cgi?id=17027,
> but disabling explicit instantiations seems like a pretty big hammer
> considering the drawbacks.
>
> I'd like to restore these instantiations. Any thoughts on how to handle
> things like pr17027 in a less heavy handed way?
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list