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