https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88971
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |hubicka at gcc dot gnu.org --- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Jonathan Wakely from comment #3) > (In reply to Richard Biener from comment #1) > > This is because it still needs to generate the std::string objects at the > > caller > > site (outside of the if (print)). This involves quite some code to get > > rid of, and even at -O3 we do not inline basic_string::basic_string it seems > > (ISTR that is out-of-line in the library): > > > > __asm__ __volatile__("mfence" : : : "memory"); > > _6 = MEM[(const int *)&data + 4B]; > > if (_6 > 0) > > goto <bb 3>; [41.48%] > > else > > goto <bb 11>; [58.52%] > > > > <bb 3> [local count: 445388109]: > > std::basic_string<char>::basic_string (&D.39204, "<", &D.39205); > > _7 = MEM[(char * *)&D.39204]; > > _8 = _7 + 18446744073709551592; > > if (_8 != &_S_empty_rep_storage) > > goto <bb 5>; [10.00%] > > else > > goto <bb 4>; [90.00%] > > Looks like you're using -D_GLIBCXX_USE_CXX11_ABI=0 but the OP is not. Indeed. It's still missed inlining that makes elding of the argument construction difficult. Looks like std::__cxx11::basic_string<char>::_M_construct<const char*> is not marked inline (so needs -finline-functions to get IPA inlining processing). Indeed I see // For forward_iterators up to random_access_iterators, used for // string::iterator, _CharT*, etc. template<typename _FwdIterator> void _M_construct(_FwdIterator __beg, _FwdIterator __end, std::forward_iterator_tag); and others.