Skip to content

Commit

Permalink
Add __builtion_unreachable to vector::size(), vector::capacity()
Browse files Browse the repository at this point in the history
This patch makes it clear that vector sizes and capacities are not
negative.  With recent change to ipa-fnsummary this should not affect
inlining and improves codegen of some vector manipulation functions.

I tested clang build.  Looking for throw_bad calls there are only 3
called considerably often (bad_allloc, bad_array_new_length and
function_callv).
The patch seems to reduce bad_alloc and bad_array_new_length calls
considerably:

bad_alloc 380->147
bad_array_new_length 832->128

libstdc++-v3/ChangeLog:

	PR tree-optimization/109442
	* include/bits/stl_vector.h: (vector::size(),
	vector::capacity()): Add __builtin_unreachable call to announce
	that size and capacity are non-negative.

gcc/testsuite/ChangeLog:

	PR tree-optimization/109442
	* g++.dg/tree-ssa/pr109442.C: New test.
  • Loading branch information
janhubicka committed Nov 17, 2024
1 parent a649efe commit aac5c57
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
2 changes: 1 addition & 1 deletion gcc/testsuite/g++.dg/tree-ssa/pr109442.C
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// { dg-do compile { target c++11 } }
// { dg-options "-O1 -fdump-tree-optimized" }
// { dg-options "-O2 -fdump-tree-optimized" }
#include <vector>
#define T int
T vat1(std::vector<T> v1) {
Expand Down
14 changes: 11 additions & 3 deletions libstdc++-v3/include/bits/stl_vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -1114,7 +1114,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
size_type
size() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
{
ptrdiff_t __dif = this->_M_impl._M_finish - this->_M_impl._M_start;
if (__dif < 0)
__builtin_unreachable ();
return size_type(__dif);
}

/** Returns the size() of the largest possible %vector. */
_GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
Expand Down Expand Up @@ -1201,8 +1206,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 (__dif < 0)
__builtin_unreachable ();
return size_type(__dif);
}

/**
Expand Down

0 comments on commit aac5c57

Please sign in to comment.