From: Paul Eggert Date: Fri, 13 Nov 2015 20:27:57 +0000 (-0800) Subject: xalloc-oversized: improve performance with GCC 5 X-Git-Tag: v1.0~6894 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=9c919a06435266a88d91ffb9eb3f70a82aa65b4b;p=gnulib.git xalloc-oversized: improve performance with GCC 5 * lib/xalloc-oversized.h (xalloc_oversized): Improve performance with GCC 5 by using __builtin_mul_overflow. --- diff --git a/ChangeLog b/ChangeLog index 7bfce974f9..fffa98a306 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-11-13 Paul Eggert + + 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 intprops: new public macro EXPR_SIGNED diff --git a/lib/xalloc-oversized.h b/lib/xalloc-oversized.h index f0e9778f73..0e579deb2b 100644 --- a/lib/xalloc-oversized.h +++ b/lib/xalloc-oversized.h @@ -16,9 +16,13 @@ along with this program. If not, see . */ #ifndef XALLOC_OVERSIZED_H_ -# define XALLOC_OVERSIZED_H_ +#define XALLOC_OVERSIZED_H_ -# include +#include + +#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 @@ -32,7 +36,12 @@ 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_ */