<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/139240>139240</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang] optimization: clang does not know memcpy returns its first arg
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
rockeet
</td>
</tr>
</table>
<pre>
```c++
void foo(char* buf, const char* src, size_t n) {
auto ptr = (char*)memcpy(buf, src, n);
memcpy(ptr + n, &n, sizeof(n));
}
```
gcc generate code:
```masm
foo3(char*, char const*, unsigned long):
push rbx
mov rbx, rdx
call memcpy
mov QWORD PTR [rax+rbx], rbx
pop rbx
ret
```
gcc knows memcpy returns its first arg.
clang generate code:
```masm
push r14
push rbx
push rax
mov rbx, rdx
mov r14, rdi
call memcpy@PLT
mov qword ptr [r14 + rbx], rbx
add rsp, 8
pop rbx
pop r14
ret
```
clang does not know memcpy returns its first arg
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVF1vozoU_DWHl6NG5gAJPPCQD-XpSre3qnQfV8YY4i1g1jbpx69f2SFpum23uxICaeyZMzNY5taqdpCyhGwD2S7ikztoUxotHqR0UaXr5xKW7PQIoI1_2PqoVY2N1kC5OHADtMZqaoC2KPRgHZ5Ba4QHrXqR3xwOQAXCygsgIvLJaRydQUh2-KoEVPSyF-MzUD6LzjKeD8mZftkUJGjjl7cItBzOI3UDlAfSmQernX-fAwFbt0JgKwdpuJModC0hWV9v6bntga0brZNri9sQ8ZR2BqYhVFljp4c2TPRCOE724O2a6mk2HszrI55R2qKprxcF77qrhG9Z__3_790Ob-_vELKN4U9AGy-S7YLOmyGjHvH9aCPdBx08DPrRzhP9lskMFpWz2ChjHXLTLjyLrUXHh_ZPKru48AWYOP0VemfsgvKvm7qgcXpC1ef9pez2n_sPFH88alOfDmC2MXEaDtFnXfK6Pg20o1_Mv6zZo29Tvy_-1GWtpcVBu_APfvsLorpM6iIpeCTLeJUuV_kyYVl0KKuUNTWllYxXPF_GPOPLVcy5yIjEMpV5pEpilLGMFXH4LvKiyRMpeCzigsU8hpTJnqtu0XXHfqFNGylrJ1nGSUEpizpeyc6GW4Io2AYif2GY0hNuqqm1kLJOWWdfJZxyXbhatoGR7VCPTvXqhTulB0jW-NcNTKYrD86N1h862gPtW-UOU7UQugfa-9Hz52Y0-rsUDmgfolig_ZzmWNLPAAAA__-K_m8z">