https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90436
Jan Hubicka <hubicka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|--- |FIXED
Status|UNCONFIRMED |RESOLVED
--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
For testcase from #1 we compile _M_check_len to:
<bb 4> [local count: 187153200]:
_13 = MEM[(const struct vector *)v_3(D)].D.25570._M_impl.D.24881._M_start;
_14 = _6 - _13;
__dif_15 = _14 /[ex] 4;
_16 = (long unsigned int) __dif_15;
if (_16 == 2305843009213693951)
goto <bb 5>; [0.00%]
else
goto <bb 6>; [100.00%]
<bb 5> [count: 0]:
std::__throw_length_error ("vector::_M_realloc_append");
<bb 6> [local count: 187153200]:
_17 = MAX_EXPR <_16, 1>;
__len_18 = _16 + _17;
_19 = MIN_EXPR <__len_18, 2305843009213693951>;
Which seems quite good to me.
Testcase from #2 has runtime 0.466s for gcc 11, 12 and 13. GCC 14 and trunk has
0.409s (I think mostly the _M_realloc_append and _M_check_len work).
Clang does 0.608s with libstdc++ and 0.432s with libc++.
Adding v.reserve(1000) now improves code to 0.231s also since GCC14.
For clang it makes no difference with libstdc++ and with libc++ it improves to
0.235s, too.
So I think this PR should be solved.