[cfe-dev] Clang generates absurd amount of assembly for libc++ std::vector::emplace

via cfe-dev cfe-dev at lists.llvm.org
Mon Jul 23 16:43:15 PDT 2018


Hello all,

 

Just a quick question to make sure I'm not missing something.

 

This program:

 

#include <vector>

void f(std::vector<double>& vec, double val) {

      vals.emplace(std::cbegin(vec), val);

}

 

When compiled with trunk Clang on Godbolt with -O3 -march=haswell -std=c++17
-stdlib=libstdc++, 132 lines of assembly are produced. If -stdlib=libc++ is
used, though, 638 (!) lines of assembly are produced. A few of those lines
are due to f() itself, but it appears the vast majority are due to the
implementation of emplace(). As a partial comparison, GCC trunk produced 136
lines of assembly, and seems to have partially inlined emplace(), leaving 94
lines of assembly for _M_realloc_insert.

 

I can sort of duplicate this on Debian sid, with libc++-dev 6.0.1-1 and
clang++-7 (--version doesn't appear to give a revision number,
unfortunately?). Using libstdc++ results in 176 lines of assembly, and
libc++ results in 803 lines of assembly (counted by wc -l).

 

Is this something to be worried about? I'm still rather new to
performance-related work, so I'm working from a relatively simplistic view
of what could be affecting performance. A 4x difference in what could be a
commonly-used function seems rather unusual to me, though.

 

Thanks,

 

Alex

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180723/8dd1ca68/attachment-0001.html>


More information about the cfe-dev mailing list