<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59116>59116</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Swapping small struct creates on stack temporary
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chfast
</td>
</tr>
</table>
<pre>
In the function swapping two objects of small struct type the unnecessary temporary storage on stack is used.
```cpp
struct U
{
unsigned long a[2];
};
void swap(U& x, U& y)
{
auto t = x;
x = y;
y = t;
}
```
```llvm
define dso_local void @_Z4swapR1US0_(ptr nocapture noundef nonnull align 8 dereferenceable(16) %0, ptr nocapture noundef nonnull align 8 dereferenceable(16) %1) local_unnamed_addr #0 {
%3 = alloca [2 x i64], align 8
call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)
call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %3, ptr noundef nonnull align 8 dereferenceable(16) %0, i64 16, i1 false), !tbaa.struct !6
tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %0, ptr noundef nonnull align 8 dereferenceable(16) %1, i64 16, i1 false), !tbaa.struct !6
call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %1, ptr noundef nonnull align 8 dereferenceable(16) %3, i64 16, i1 false), !tbaa.struct !6
call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)
ret void
}
```
```asm
swap(U&, U&): # @swap(U&, U&)
movups xmm0, xmmword ptr [rdi]
movaps xmmword ptr [rsp - 24], xmm0
movups xmm0, xmmword ptr [rsi]
movups xmmword ptr [rdi], xmm0
movaps xmm0, xmmword ptr [rsp - 24]
movups xmmword ptr [rsi], xmm0
ret
```
https://godbolt.org/z/MWz3vfqPj
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1Vktv2zAM_jX2Rahhy4njHHxYVwzYYcCwohiwSyBbdKJOljxJTpv--lFKnEeRFku7-qU3-X0kRbnWfFN9VcStgLSDapzQitgH1vdCLYl70ETX99A4S3RLbMekJNaZoXHEbXoIywaloAFrmdkQB12vja9Zh-USiBfnWPObCEsGCzyJ0pso_bT7Fun2afp-27MTfrcbn11vKwSvQVmxVMCJ1AiNRdNrGk1vovx6nHtUD9-1FjxwiWh5F9GCPEb0Mwm1TUTnZ1SwwWniSJTf4Nz8aOAx9G1O-jahz50AOGV1lqqU627bxaEVCgi3eiF1wyQJgKNJuvg18bB_ZHe36QLB984QhTN6NxjA2qBwKZZKDegPJtEspCQcDLT4qgZYLQHXZQXSJBGdpp74u6VkvgxIF-hz1gFfMM4NDuUpObIjTs2DbTBacDbxnkILimLi_YVIdrrG-Y2PqpG7N08iRQtOdJBg6BiX9Ii_xOXEQxmJbGF7XXtfnhPVQdf0GxThHw9hNOfF9POD7rc54MBAZKRl0oJHjs2IZq5mLNkFPzaLkZBjQn4oq_QdrLK3svpIQtk7COX_j9A-hEHxCwLYgAtyLkopzO4yylGyG1Odl52HfHX-ws3rMb-wcp_s_NXp9dBbTIZdF6IGywdteKCDe9xw4ff38yVst-Rkqu3JFaFjPggCL1Jlz6oazqnaonpJC3tVywHlP6myL6tCv77iyZVzvUU3RfQLPkvNay1dos0SW0_4fvv5lK_bP9_vY6iyopinxaTM05hXOZ_ncxY74SRUt-OxfXJONwaYA3s4iPdndDwYWT1TLdxqqJNGd9gIJ9W2uOqN9r8B2BTWDmCxMp1nWRGvKqCzmrYsnXCYcd7krCx4WwJv0pLN5xMWS1aDtBVaKKJUwQMJIrCO1opFRVNKs4zinc6yNClnKGZap1lblnzG5hic0GEWTMK2QpvEpgqQ6mFp_W4T1tnDILPhLwGCOpSPR_pKm6pZtcy6OGiuAvK_OrSq4Q">