<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61987>61987</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            missed loop-idiom when a vector is copied into another
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          hiraditya
      </td>
    </tr>
</table>

<pre>
    There are two missed optimization opportunities:
- the copy of elements can be a `memmove`/`memcpy` but compiler is unable to recognize the loop-idiom
- the new copy is dead so it can be removed.

```cpp
#include<vector>
#include<string>
using namespace std;

using T = int;
T vat1(std::vector<T> v1) {
 auto v = v1;
    return 10;
}
```

$ clang++ -std=c++17 -O3 -fno-exceptions

```asm
vat1(std::__1::vector<int, std::__1::allocator<int> >): # @vat1(std::__1::vector<int, std::__1::allocator<int> >)
        push    r15
        push    r14
 push    rbx
        sub     rsp, 32
        xorps   xmm0, xmm0
        movaps  xmmword ptr [rsp], xmm0
        mov     qword ptr [rsp + 16], 0
        mov     r15, qword ptr [rdi]
        mov     r14, qword ptr [rdi + 8]
        mov     rbx, r14
        sub     rbx, r15
        je      .LBB0_10
        js      .LBB0_11
        mov rdi, rbx
        call    operator new(unsigned long)@PLT
        add rbx, -4
        cmp     rbx, 28
        jb      .LBB0_3
 mov     rcx, rax
        sub     rcx, r15
        cmp     rcx, 32
 jb      .LBB0_3
        shr     rbx, 2
        inc     rbx
 mov     rsi, rbx
        and     rsi, -8
        lea     rcx, [r15 + 4*rsi]
        lea     rdx, [rax + 4*rsi]
        xor     edi, edi
.LBB0_6:                                # =>This Inner Loop Header: Depth=1
        movups  xmm0, xmmword ptr [r15 + 4*rdi]
        movups xmm1, xmmword ptr [r15 + 4*rdi + 16]
        movups  xmmword ptr [rax + 4*rdi], xmm0
        movups  xmmword ptr [rax + 4*rdi + 16], xmm1
 add     rdi, 8
        cmp     rsi, rdi
        jne     .LBB0_6
 cmp     rbx, rsi
        jne     .LBB0_8
        jmp .LBB0_9
.LBB0_3:
        mov     rcx, r15
        mov     rdx, rax
.LBB0_8:                                # =>This Inner Loop Header: Depth=1
        mov     esi, dword ptr [rcx]
        mov     dword ptr [rdx], esi
        add     rcx, 4
        add     rdx, 4
        cmp rcx, r14
        jne     .LBB0_8
.LBB0_9:
        mov     rdi, rax
        call    operator delete(void*)@PLT
.LBB0_10:
        mov eax, 10
        add     rsp, 32
        pop     rbx
        pop r14
        pop     r15
        ret
.LBB0_11:
        mov rdi, rsp
        call    std::__1::vector<int, std::__1::allocator<int> >::__throw_length_error[abi:v170000]() const
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V01vqzoT_jXOZpQKbEjIIoukafW-UqV7F91Xxp4GV2BzbZOm59dfGQgFkpxzFvdEVa3kmWe-Z8DcOXXUiFuS7kl6WPDGF8ZuC2W5VP6LL3Ijv7avBVoEbhH8p4FKOYcSTO1VpX5wr4wGU9fG-kYrr9ARtiPRgUS7JfgCQZj6C8w7YIkVau9AcA05AgeyiiqsKnNCsooIfe6-i_qLrCLIGw_CVLUq0YJy0GielwjegEVhjlr9wFZ9aUy9VFKZamxU42dnWDmQyCU4A8pfTFsMRuVDx-j_r6LuT9R1_wtlSouykUjY4wmFN5awpxuY81bp44A1TukjaF6hq7lAcF4Sth_b6iRegbADKO0H9BVO3MeEZi1lR9juYvbxlbAnOMWEboCse3HgjTdwatWc4kELAIBF31gNcfRteX2YBTqJniYgSq6PhO4J3cOy9eAguq_xGpZ_MVi-a7PEs8A6FN3dzB53fR3mkby9xbOQQuT0Ea4leFkawb-F2BOE5NINYTsglAFJoj-ifkhf-NSNK9pUxuk9IOmB4Zf8PBV1Td6e1tXBF0an8NnY2oWzqqKAt-dEojInHkTOVfVprITaWyDpPuhLD3cp7fnPjAChrvGq590hhWDp44wrVSDdkU9uybe2svus_BxY3wmcp-uCzzL_gd358LLfR2_xLIYPN0Hja9shkqB3XibByzKcpkYbGiOsD0KzRrfbUUJpwmBsSBL9_fI6pXIpL-4uZ9GIqh5HQ7OZu_nYXdaDQ4pElwJ-r6PE7RQNRjt86Ljb1i5KCzvxdIoqLQZ05qS7nU-u5RhfziIvkY99DC0Tp23LJITuAmneOANDDgx-_injbLqQsCt5OFq8i38VNskvPu2iYQfCnl4L5eD_WqOFF2Nq-B9yiTaoOGDtC8IO173W9FN7mevJgIyjvT1cgX6uqvjX7NFY3_Nhwh7nrbN9b4v8Bn26U1qH-yeT7DugS392p0n7_rkU54J_aBw166oHZ_MUyD9hzaetqntgM24ENrysjAIfN-fVgA24nA7oxeqfbqz2xC5xclIacb67cKeC8twXDOcpHMrWBZ_cQeUtNJRnSFryG6W5lONuBfptPV-BV9taYokeCc1ORklCd7NVPTwtbhlC3no8f5YMod5-cNfmuxWvgKvoB-l5L1n0Exfjmy5e8uDq23n4D9-BeiFfWPP5VqI--uINrTWWpHueq6A6XkdRFLUNlIW3UWG087OXwIXcMrlhG77AbbzKoizK2DpdFNt3mawjRlkuKa7XWZ6IjEqUWZwzjHLxvlBbGlEWJdEq3sQ0TR_eNzLeZGnKok2aC5GTJMKKq_KhLE_Vg7HHhXKuwe0q3mTrRclzLF17m6E03AFakFAaLjd2GzjLvDk6kkSlct59a_HKl7jt7zbfdwr4LFADhy6j4TYhTK1Qhtd2A1wbX6BdNLbcFt7X7dWHPhP6fFS-aPIHYSpCn4OR_ljW1nyg8IQ-t645Qp9b1_8NAAD__7z4nWM">