libstdc++: Optimize std::optional default constructor
authorMarc Glisse <marc.glisse@inria.fr>
Fri, 19 Jun 2020 11:07:33 +0000 (12:07 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 19 Jun 2020 11:15:43 +0000 (12:15 +0100)
commitbafd12cb22e83b7da8946873513a897e48e2900f
tree09e4f83862b416060ac472d6864086838835c4d5
parent6894d9101e6324972b5b105227f3412a6c46549d
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.
libstdc++-v3/include/std/optional