Remove unnecesary bulitin_expect markers

Jan Hubicka hubicka@ucw.cz
Sat Apr 18 22:37:00 GMT 2009


Hi,
libstdc++ headers include a lot of __builtin_expect calls guarding
throw.  GCC can work out this bit itself becuase function is noreturn.
Having the __builtin_expect markers there is just going to add some IL
overhead until end of inlining process.

Tested on x86_64-linux, OK?
Honza

	* include/tr1_impl/array (at): Do not use builtin_expect.
	* include/ext/throw_allocator.h (allocate): Likewise.
	* include/ext/pool_allocator.h (allocate): Likweise.
	* include/ext/bitmap_allocator.h (allocate): Likewise.
	* include/ext/rc_string_base.h (_S_construct): Likewise.
	* include/ext/malloc_allocator.h (allocate): Likewise.
	* include/ext/mt_allocator.h (allocate): Likewise.
	* include/ext/sso_string_base.h (_M_construct): Likewise.
	* include/bits/basic_string.tcc (_S_construct): Likewise.
Index: include/tr1_impl/array
===================================================================
--- include/tr1_impl/array	(revision 146328)
+++ include/tr1_impl/array	(working copy)
@@ -149,7 +149,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
       reference
       at(size_type __n)
       {
-	if (__builtin_expect(__n >= _Nm, false))
+	if (__n >= _Nm)
 	  std::__throw_out_of_range(__N("array::at"));
 	return _M_instance[__n];
       }
@@ -157,7 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
       const_reference
       at(size_type __n) const
       {
-	if (__builtin_expect(__n >= _Nm, false))
+	if (__n >= _Nm)
 	  std::__throw_out_of_range(__N("array::at"));
 	return _M_instance[__n];
       }
Index: include/ext/throw_allocator.h
===================================================================
--- include/ext/throw_allocator.h	(revision 146328)
+++ include/ext/throw_allocator.h	(working copy)
@@ -220,7 +220,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       pointer
       allocate(size_type __n, std::allocator<void>::const_pointer hint = 0)
       {
-	if (__builtin_expect(__n > this->max_size(), false))
+	if (__n > this->max_size())
 	  std::__throw_bad_alloc();
 
 	throw_conditionally();
Index: include/ext/pool_allocator.h
===================================================================
--- include/ext/pool_allocator.h	(revision 146328)
+++ include/ext/pool_allocator.h	(working copy)
@@ -200,7 +200,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       pointer __ret = 0;
       if (__builtin_expect(__n != 0, true))
 	{
-	  if (__builtin_expect(__n > this->max_size(), false))
+	  if (__n > this->max_size())
 	    std::__throw_bad_alloc();
 
 	  // If there is a race through here, assume answer from getenv
@@ -230,7 +230,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 		  *__free_list = __result->_M_free_list_link;
 		  __ret = reinterpret_cast<_Tp*>(__result);
 		}
-	      if (__builtin_expect(__ret == 0, 0))
+	      if (__ret == 0)
 		std::__throw_bad_alloc();
 	    }
 	}
Index: include/ext/bitmap_allocator.h
===================================================================
--- include/ext/bitmap_allocator.h	(revision 146328)
+++ include/ext/bitmap_allocator.h	(working copy)
@@ -1049,7 +1049,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       pointer 
       allocate(size_type __n)
       {
-	if (__builtin_expect(__n > this->max_size(), false))
+	if (__n > this->max_size())
 	  std::__throw_bad_alloc();
 
 	if (__builtin_expect(__n == 1, true))
Index: include/ext/rc_string_base.h
===================================================================
--- include/ext/rc_string_base.h	(revision 146328)
+++ include/ext/rc_string_base.h	(working copy)
@@ -546,7 +546,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 	  return _S_empty_rep._M_refcopy();
 
 	// NB: Not required, but considered best practice.
-	if (__builtin_expect(__is_null_pointer(__beg) && __beg != __end, 0))
+	if (__is_null_pointer(__beg) && __beg != __end)
 	  std::__throw_logic_error(__N("__rc_string_base::"
 				       "_S_construct NULL not valid"));
 
Index: include/ext/new_allocator.h
===================================================================
--- include/ext/new_allocator.h	(revision 146328)
+++ include/ext/new_allocator.h	(working copy)
@@ -83,7 +83,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       pointer
       allocate(size_type __n, const void* = 0)
       { 
-	if (__builtin_expect(__n > this->max_size(), false))
+	if (__n > this->max_size())
 	  std::__throw_bad_alloc();
 
 	return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
Index: include/ext/malloc_allocator.h
===================================================================
--- include/ext/malloc_allocator.h	(revision 146328)
+++ include/ext/malloc_allocator.h	(working copy)
@@ -84,7 +84,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       pointer
       allocate(size_type __n, const void* = 0)
       {
-	if (__builtin_expect(__n > this->max_size(), false))
+	if (__n > this->max_size())
 	  std::__throw_bad_alloc();
 
 	pointer __ret = static_cast<_Tp*>(std::malloc(__n * sizeof(_Tp)));
Index: include/ext/mt_allocator.h
===================================================================
--- include/ext/mt_allocator.h	(revision 146328)
+++ include/ext/mt_allocator.h	(working copy)
@@ -674,7 +674,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
     __mt_alloc<_Tp, _Poolp>::
     allocate(size_type __n, const void*)
     {
-      if (__builtin_expect(__n > this->max_size(), false))
+      if (__n > this->max_size())
 	std::__throw_bad_alloc();
 
       __policy_type::_S_initialize_once();
Index: include/ext/sso_string_base.h
===================================================================
--- include/ext/sso_string_base.h	(revision 146328)
+++ include/ext/sso_string_base.h	(working copy)
@@ -428,7 +428,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
 		   std::forward_iterator_tag)
       {
 	// NB: Not required, but considered best practice.
-	if (__builtin_expect(__is_null_pointer(__beg) && __beg != __end, 0))
+	if (__is_null_pointer(__beg) && __beg != __end)
 	  std::__throw_logic_error(__N("__sso_string_base::"
 				       "_M_construct NULL not valid"));
 
Index: include/bits/basic_string.tcc
===================================================================
--- include/bits/basic_string.tcc	(revision 146328)
+++ include/bits/basic_string.tcc	(working copy)
@@ -129,8 +129,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 	  return _S_empty_rep()._M_refdata();
 #endif
 	// NB: Not required, but considered best practice.
-	if (__builtin_expect(__gnu_cxx::__is_null_pointer(__beg)
-			     && __beg != __end, 0))
+	if (__gnu_cxx::__is_null_pointer(__beg) && __beg != __end, 0)
 	  __throw_logic_error(__N("basic_string::_S_construct NULL not valid"));
 
 	const size_type __dnew = static_cast<size_type>(std::distance(__beg,



More information about the Libstdc++ mailing list