aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-08-13 19:54:38 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-08-13 19:54:38 +0100
commit2383ed026914b85980520278455f97c270006d4d (patch)
tree62ef9e0c82e2e10010b35153162acaf010635c9f
parent7997ede243f459020ec756905749dea47187e0a8 (diff)
downloadgcc-2383ed026914b85980520278455f97c270006d4d.zip
gcc-2383ed026914b85980520278455f97c270006d4d.tar.gz
gcc-2383ed026914b85980520278455f97c270006d4d.tar.bz2
Minor optimisations in operator new(size_t, align_val_t)
* 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
-rw-r--r--libstdc++-v3/ChangeLog4
-rw-r--r--libstdc++-v3/libsupc++/new_opa.cc6
2 files changed, 7 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 2a785c3..5f4e822 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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>.
diff --git a/libstdc++-v3/libsupc++/new_opa.cc b/libstdc++-v3/libsupc++/new_opa.cc
index aa3e5dc..abb7451 100644
--- a/libstdc++-v3/libsupc++/new_opa.cc
+++ b/libstdc++-v3/libsupc++/new_opa.cc
@@ -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;