]> Savannah Git Hosting - gnulib.git/commitdiff
xalloc-oversized: improve performance with GCC 5
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 13 Nov 2015 20:27:57 +0000 (12:27 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 13 Nov 2015 20:28:18 +0000 (12:28 -0800)
* lib/xalloc-oversized.h (xalloc_oversized):
Improve performance with GCC 5 by using __builtin_mul_overflow.

ChangeLog
lib/xalloc-oversized.h

index 7bfce974f9afeac7b61832f905c1f2d21e922bb3..fffa98a3069c3ddd532b30f1bc9b7b93f89be92b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-11-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+       xalloc-oversized: improve performance with GCC 5
+       * lib/xalloc-oversized.h (xalloc_oversized):
+       Improve performance with GCC 5 by using __builtin_mul_overflow.
+
 2015-11-10  Paul Eggert  <eggert@cs.ucla.edu>
 
        intprops: new public macro EXPR_SIGNED
index f0e9778f7382bcdac604dcdc8deaaf8371c1ba2f..0e579deb2bb289898c84c4c2161c683551e814cf 100644 (file)
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #ifndef XALLOC_OVERSIZED_H_
-# define XALLOC_OVERSIZED_H_
+#define XALLOC_OVERSIZED_H_
 
-# include <stddef.h>
+#include <stddef.h>
+
+#ifndef __has_builtin
+# define __has_builtin(x) 0
+#endif
 
 /* Return 1 if an array of N objects, each of size S, cannot exist due
    to size arithmetic overflow.  S must be positive and N must be
    sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
    exactly-SIZE_MAX allocations on such hosts; this avoids a test and
    branch when S is known to be 1.  */
+#if 5 <= __GNUC__ || __has_builtin (__builtin_mul_overflow)
+# define xalloc_oversized(n, s) \
+    ({ size_t __xalloc_size; __builtin_mul_overflow (n, s, &__xalloc_size); })
+#else
 # define xalloc_oversized(n, s) \
     ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+#endif
 
 #endif /* !XALLOC_OVERSIZED_H_ */