[Bug libstdc++/110287] _M_check_len is expensive
hubicka at ucw dot cz
gcc-bugzilla@gcc.gnu.org
Mon Jun 19 10:24:00 GMT 2023
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110287
--- Comment #7 from Jan Hubicka <hubicka at ucw dot cz> ---
>
> There is no guarantee that std::vector<T, A>::max_size() is PTRDIFF_MAX. It
> depends on the Allocator type, A. A user-defined allocator could have
> max_size() == 100.
If inliner we see path to the throw functions, it will not determine
_M_check_len as early inlinable.
Perhaps we can __builtin_constant_p it as well and check that
max_size () * sizeof ()
is close to ptrdiff_max.
Thanks for the comments on the patches. I will try to update the patch.
I was wondering about the allocators. As shown in the mail, optimiznig
_M_check_len still leaves two independent throws for insanely large
ops. Since allocator is user replaceable, I guess we can not add new
member function for safe_allocate or so.
We can use __builtin_unreachable to set the value range on the return
value. For that to work during early optimizations we need
1) extend early VRP to retrofit the value determined by
__builtin_unreachable to the SSA name defned earlier based on fact
that the execution can not legally terminate in between
2) teaching inliner to ignore conditionals guaring __builtin_unreacable
3) add support for return functions to propagate the value range from
_M_check_len to _M_reallocate_insert.
so it is correctly propagated to allocator call.
This is not very easy, but can be generally useful elsewhere.
More information about the Gcc-bugs
mailing list