Minor optimisations in operator new(size_t, align_val_t)
authorJonathan Wakely <jwakely@redhat.com>
Mon, 13 Aug 2018 18:54:38 +0000 (19:54 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 13 Aug 2018 18:54:38 +0000 (19:54 +0100)
* libsupc++/new_opa.cc (operator new(size_t, align_val_t)): Use
__is_pow2 to check for valid alignment. Avoid branching when rounding
size to multiple of alignment.

From-SVN: r263515

libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/new_opa.cc

index 2a785c38916a54d62960d65713f97d40934272f6..5f4e8221ab3aabf4e7c791af62da9343456aae4c 100644 (file)
@@ -1,5 +1,9 @@
 2018-08-13  Jonathan Wakely  <jwakely@redhat.com>
 
+       * libsupc++/new_opa.cc (operator new(size_t, align_val_t)): Use
+       __is_pow2 to check for valid alignment. Avoid branching when rounding
+       size to multiple of alignment.
+
        * include/Makefile.am: Install <bit> and <version> for freestanding.
        * include/Makefile.in: Regenerate.
        * testsuite/17_intro/freestanding.cc: Check for <bit> and <version>.
index aa3e5dc4ce5d6ed553e3e1ab4e0e60c972e63aa8..abb7451fafeca9ff2c39c8b81f0047de75afa0b9 100644 (file)
@@ -27,6 +27,7 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <bits/exception_defines.h>
+#include <bit>
 #include "new"
 
 #if !_GLIBCXX_HAVE_ALIGNED_ALLOC && !_GLIBCXX_HAVE__ALIGNED_MALLOC \
@@ -105,7 +106,7 @@ operator new (std::size_t sz, std::align_val_t al)
 
   /* Alignment must be a power of two.  */
   /* XXX This should be checked by the compiler (PR 86878).  */
-  if (__builtin_expect (align & (align - 1), false))
+  if (__builtin_expect (!std::__ispow2(align), false))
     _GLIBCXX_THROW_OR_ABORT(bad_alloc());
 
   /* malloc (0) is unpredictable; avoid it.  */
@@ -120,8 +121,7 @@ operator new (std::size_t sz, std::align_val_t al)
     align = sizeof(void*);
 # endif
   /* C11: the value of size shall be an integral multiple of alignment.  */
-  if (std::size_t rem = sz & (align - 1))
-    sz += align - rem;
+  sz = (sz + align - 1) & ~(align - 1);
 #endif
 
   void *p;