https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88971
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization CC| |rguenth at gcc dot gnu.org Component|c++ |libstdc++ --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- 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%] <bb 4> [local count: 434030711]: goto <bb 10>; [100.00%] <bb 5> [local count: 44538811]: if (__gthrw___pthread_key_create != 0B) goto <bb 6>; [53.47%] else goto <bb 7>; [46.53%] <bb 6> [local count: 23814902]: _9 = &MEM[(struct _Rep *)_7 + -24B].D.23940._M_refcount; _10 = __atomic_fetch_add_4 (_9, 4294967295, 4); _11 = (int) _10; goto <bb 8>; [100.00%] <bb 7> [local count: 20723909]: __result_12 = MEM[(_Atomic_word *)_7 + -8B]; _13 = __result_12 + -1; MEM[(_Atomic_word *)_7 + -8B] = _13; <bb 8> [local count: 44538811]: # _14 = PHI <_11(6), __result_12(7)> if (_14 <= 0) goto <bb 9>; [25.50%] else goto <bb 4>; [74.50%] <bb 9> [local count: 11357397]: std::basic_string<char>::_Rep::_M_destroy (_8, &D.39206); <bb 10> [local count: 445388108]: D.39206 ={v} {CLOBBER}; D.39204 ={v} {CLOBBER}; D.39205 ={v} {CLOBBER}; <bb 11> [local count: 1073741825]: __asm__ __volatile__("mfence" : : : "memory"); data ={v} {CLOBBER};