public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/110909] New: Suboptimal codegen in vector copy assignment
@ 2023-08-05  5:11 hiraditya at msn dot com
  2023-08-05  5:18 ` [Bug libstdc++/110909] Missed optimization: " pinskia at gcc dot gnu.org
  2023-08-05 13:37 ` redi at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: hiraditya at msn dot com @ 2023-08-05  5:11 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 110909
           Summary: Suboptimal codegen in vector copy assignment
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hiraditya at msn dot com
  Target Milestone: ---

#include<vector>

using Container = std::vector<int>;
int copy_assignment(const Container &v1, Container &v2) {
  v2 = v1;
  return 0;
}


I'd expect this to only generate a memcpy. but i'm not sure why memmoves are
generated?

$ gcc -std=c++2a -O3  -fno-exceptions

copy_assignment(std::vector<int, std::allocator<int> > const&, std::vector<int,
std::allocator<int> >&):
        cmp     rsi, rdi
        je      .L21
        push    r13
        push    r12
        push    rbp
        mov     rbp, rdi
        push    rbx
        mov     rbx, rsi
        sub     rsp, 8
        mov     rax, QWORD PTR [rdi+8]
        mov     r13, QWORD PTR [rdi]
        mov     rdx, QWORD PTR [rsi+16]
        mov     rdi, QWORD PTR [rsi]
        mov     r12, rax
        sub     r12, r13
        sub     rdx, rdi
        cmp     rdx, r12
        jb      .L25
        mov     rcx, QWORD PTR [rsi+8]
        mov     rdx, rcx
        sub     rdx, rdi
        cmp     rdx, r12
        jnb     .L26
        cmp     rdx, 4
        jle     .L12
        mov     rsi, r13
        call    memmove
        mov     rcx, QWORD PTR [rbx+8]
        mov     rdi, QWORD PTR [rbx]
        mov     rax, QWORD PTR [rbp+8]
        mov     r13, QWORD PTR [rbp+0]
        mov     rdx, rcx
        sub     rdx, rdi
.L13:
        lea     rsi, [r13+0+rdx]
        sub     rax, rsi
        mov     rdx, rax
        cmp     rax, 4
        jle     .L14
        mov     rdi, rcx
        call    memmove
        mov     rax, QWORD PTR [rbx]
        add     rax, r12
.L8:
        mov     QWORD PTR [rbx+8], rax
        add     rsp, 8
        xor     eax, eax
        pop     rbx
        pop     rbp
        pop     r12
        pop     r13
        ret
.L21:
        xor     eax, eax
        ret
.L25:
        movabs  rax, 9223372036854775804
        cmp     rax, r12
        jb      .L27
        mov     rdi, r12
        call    operator new(unsigned long)
        mov     rbp, rax
        cmp     r12, 4
        jle     .L5
        mov     rdx, r12
        mov     rsi, r13
        mov     rdi, rax
        call    memcpy
.L6:
        mov     rdi, QWORD PTR [rbx]
        test    rdi, rdi
        je      .L7
        mov     rsi, QWORD PTR [rbx+16]
        sub     rsi, rdi
        call    operator delete(void*, unsigned long)
.L7:
        lea     rax, [rbp+0+r12]
        mov     QWORD PTR [rbx], rbp
        mov     QWORD PTR [rbx+16], rax
        jmp     .L8
.L26:
        cmp     r12, 4
        jle     .L10
        mov     rdx, r12
        mov     rsi, r13
        call    memmove
        mov     rax, QWORD PTR [rbx]
        add     rax, r12
        jmp     .L8
.L14:
        lea     rax, [rdi+r12]
        jne     .L8
        mov     edx, DWORD PTR [rsi]
        mov     DWORD PTR [rcx], edx
        jmp     .L8
.L12:
        jne     .L13
        mov     esi, DWORD PTR [r13+0]
        mov     DWORD PTR [rdi], esi
        jmp     .L13
.L10:
        lea     rax, [rdi+r12]
        jne     .L8
        mov     edx, DWORD PTR [r13+0]
        mov     DWORD PTR [rdi], edx
        jmp     .L8
.L5:
        mov     eax, DWORD PTR [r13+0]
        mov     DWORD PTR [rbp+0], eax
        jmp     .L6
.L27:
        call    std::__throw_bad_array_new_length()



Ideally, the above C++ code should translate to an equivalent of the following
C++ code:

using Container = std::vector<int>;
int copy_assignment(const Container &v1, Container &v2) {
  v2.reserve(v1.size());
  std::memcpy(&v2[0], &v1[0], v1.size()*sizeof(int));
  // change the size: v2.size() = v1.size()
  return 0;
}

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug libstdc++/110909] Missed optimization: Suboptimal codegen in vector copy assignment
  2023-08-05  5:11 [Bug c++/110909] New: Suboptimal codegen in vector copy assignment hiraditya at msn dot com
@ 2023-08-05  5:18 ` pinskia at gcc dot gnu.org
  2023-08-05 13:37 ` redi at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-08-05  5:18 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|c++                         |libstdc++

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
_M_allocate_and_copy calls __uninitialized_copy_a which basically calls
std::copy (well kinda) which uses memmove.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug libstdc++/110909] Missed optimization: Suboptimal codegen in vector copy assignment
  2023-08-05  5:11 [Bug c++/110909] New: Suboptimal codegen in vector copy assignment hiraditya at msn dot com
  2023-08-05  5:18 ` [Bug libstdc++/110909] Missed optimization: " pinskia at gcc dot gnu.org
@ 2023-08-05 13:37 ` redi at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: redi at gcc dot gnu.org @ 2023-08-05 13:37 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Right, we don't have a std::copy-but-ranges-do-not-overlap that could be used
instead.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-08-05 13:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-05  5:11 [Bug c++/110909] New: Suboptimal codegen in vector copy assignment hiraditya at msn dot com
2023-08-05  5:18 ` [Bug libstdc++/110909] Missed optimization: " pinskia at gcc dot gnu.org
2023-08-05 13:37 ` redi at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).