https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118276

            Bug ID: 118276
           Summary: Adding empty c'tor to struct of std::array and integer
                    improves codegen
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: benfrantzdale at gmail dot com
  Target Milestone: ---

Given https://godbolt.org/z/exKd1snTM
```
struct S {
    long int c[10] = {};
    int x{};
#if MODE == 0
#elif MODE == 1
    S() = default;
#elif MODE == 2
    S() noexcept {}
#endif
};
```
I get different (!) and better(!) codegen for the `S() noexcept {}` version
than the other two versions.

Perf: https://quick-bench.com/q/9hMTq-umqhLawEZDMVXH4qKr6XU

I think (?) `S() noexcept {}` is semantically the same as `S() = default;` or
as no c'tor, so it's a surprise that `S() noexcept {}` leads to
```
        pxor    xmm0, xmm0
        mov     DWORD PTR [rdi+80], 0
        mov     rax, rdi
        movups  XMMWORD PTR [rdi], xmm0
        movups  XMMWORD PTR [rdi+16], xmm0
        movups  XMMWORD PTR [rdi+32], xmm0
        movups  XMMWORD PTR [rdi+48], xmm0
        movups  XMMWORD PTR [rdi+64], xmm0
        ret
```
versus
```
        mov     rdx, rdi
        xor     eax, eax
        mov     ecx, 11
        rep stosq
        mov     rax, rdx
        ret
```
Furthermore, my sense is contemporary style is to provide no c'tor or `=
default;` rather than `S() noexcept {}`, so here the code with better style
performs worse for no apparent reason.

Reply via email to