> > diff --git a/libstdc++-v3/include/bits/deque.tcc > > b/libstdc++-v3/include/bits/deque.tcc > > index deb010a0ebb..e56cd0b9319 100644 > > --- a/libstdc++-v3/include/bits/deque.tcc > > +++ b/libstdc++-v3/include/bits/deque.tcc > > @@ -955,6 +955,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER > > size_type __new_map_size = this->_M_impl._M_map_size > > + std::max(this->_M_impl._M_map_size, > > __nodes_to_add) + 2; > > + if (__new_map_size > ((max_size() + __deque_buf_size(sizeof(_Tp)) - 1) > > + / __deque_buf_size(sizeof(_Tp))) * 2) > > + __builtin_unreachable (); > > I think it's worth avoiding the duplicate call, for -O0 -std=c++98. > It makes the line shorter too: > > const size_t __bufsz = __deque_buf_size(sizeof(_Tp)); > if (__new_map_size > ((max_size() + __bufsz - 1) / __bufsz) * 2) > __builtin_unreachable();
This looks better, in fact that what I inteded with that forgotten veriable. I think __deque_buf_size is a constexpr and gets replaced by constant. I wonder why "const" is useful here. Also I wonder if there is any difference between size_type and size_t, or it can be used interchangeably? For -O0 we do keep the cmp instruction around, but "optimize away" the conditonal jump to unreachable, which is bit odd. An option would be to add ifdef __OPTIMIZE__ guards. This is updated patch I am testing diff --git a/libstdc++-v3/include/bits/deque.tcc b/libstdc++-v3/include/bits/deque.tcc index deb010a0ebb..ee03c917a29 100644 --- a/libstdc++-v3/include/bits/deque.tcc +++ b/libstdc++-v3/include/bits/deque.tcc @@ -956,6 +956,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER + std::max(this->_M_impl._M_map_size, __nodes_to_add) + 2; + const size_t __bufsz = __deque_buf_size(sizeof(_Tp)); + if (__new_map_size > ((max_size() + __bufsz - 1) / __bufsz) * 2) + __builtin_unreachable(); + _Map_pointer __new_map = this->_M_allocate_map(__new_map_size); __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2 + (__add_at_front ? __nodes_to_add : 0); diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index c617933bd81..dd1212793de 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -1266,7 +1266,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _GLIBCXX_NODISCARD size_type size() const _GLIBCXX_NOEXCEPT - { return this->_M_impl._M_finish - this->_M_impl._M_start; } + { + size_type __sz = this->_M_impl._M_finish - this->_M_impl._M_start; + if (__sz > max_size ()) + __builtin_unreachable (); + return __sz; + } /** Returns the size() of the largest possible %deque. */ _GLIBCXX_NODISCARD