https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109442

--- Comment #28 from Jan Hubicka <hubicka at ucw dot cz> ---
> vector::size() is called **very often** so needs to be as fast as possible.
> Does this still inline identically?

Last year I made patch for inliner to ignore conditions guarding
__builtin_unreachable. Richi convinced me I should extend it to also
handle computations feeding the conditions.  I have WIP patch for that
and then those check should become noop for inlining decisions.
> 
> I tried something like that in r14-1452-gfb409a15d9babc and reverted it in
> r14-1470-gb7b255e77a2719, but my _M_invariant() function was more complicated.
> 
> Maybe the other part of my _M_invariant() function could be added directly to
> capacity()
> 
> --- a/libstdc++-v3/include/bits/stl_vector.h
> +++ b/libstdc++-v3/include/bits/stl_vector.h
> @@ -1201,8 +1201,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
>        size_type
>        capacity() const _GLIBCXX_NOEXCEPT
>        {
> -       return size_type(this->_M_impl._M_end_of_storage
> -                          - this->_M_impl._M_start);
> +       ptrdiff_t __dif
> +         = this->_M_impl._M_end_of_storage - this->_M_impl._M_start;
> +       if (__dir < 0)
> +         __builtin_unreachable();
> +       return size_type(__dif);

If inliner handles those as noop, I think we could give it a try.
There will be some compile time costs, but hopefully not extreme. It
seems that adding the range check optimizes out quite a lot of calls
that inliner needs to do when dealing with vectors.

Honza

Reply via email to