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.