<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">