diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2020-06-19 12:07:33 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-06-19 12:15:43 +0100 |
commit | bafd12cb22e83b7da8946873513a897e48e2900f (patch) | |
tree | 09e4f83862b416060ac472d6864086838835c4d5 | |
parent | 6894d9101e6324972b5b105227f3412a6c46549d (diff) | |
download | gcc-bafd12cb22e83b7da8946873513a897e48e2900f.zip gcc-bafd12cb22e83b7da8946873513a897e48e2900f.tar.gz gcc-bafd12cb22e83b7da8946873513a897e48e2900f.tar.bz2 |
libstdc++: Optimize std::optional default constructor
The attached patch changes the code generated for
std::optional<std::array<int,1024>>f(){return{};}
from
movq $0, (%rdi)
movq %rdi, %r8
leaq 8(%rdi), %rdi
xorl %eax, %eax
movq $0, 4084(%rdi)
movq %r8, %rcx
andq $-8, %rdi
subq %rdi, %rcx
addl $4100, %ecx
shrl $3, %ecx
rep stosq
movq %r8, %rax
or with different tuning
subq $8, %rsp
movl $4100, %edx
xorl %esi, %esi
call memset
addq $8, %rsp
to the much shorter
movb $0, 4096(%rdi)
movq %rdi, %rax
i.e. the same as the nullopt constructor.
The constructor was already non-trivial, so we don't lose that. It passes the
testsuite without regression, but there is no new testcase to verify the
better codegen.
libstdc++-v3/ChangeLog:
* include/std/optional (optional()): Explicitly define it.
-rw-r--r-- | libstdc++-v3/include/std/optional | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional index b0184a4..923d45a 100644 --- a/libstdc++-v3/include/std/optional +++ b/libstdc++-v3/include/std/optional @@ -687,7 +687,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: using value_type = _Tp; - constexpr optional() = default; + constexpr optional() noexcept { } constexpr optional(nullopt_t) noexcept { } |