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

    <tr>
        <th>Summary</th>
        <td>
            Wasted stack space when passing trivial-ABI structs with 3 words or more
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Consider C++ code:

```c++
struct S {
  long a = 1;
  long b = 2;
  long c = 3;
};

void Accept(S s);

void Test() {
  Accept(S());
}
```

Clang produces the following assembly for x86-64 with -O2:

```asm
Test():                               # @Test()
        subq    $56, %rsp
        movq    $1, 32(%rsp)
        movq    $2, 40(%rsp)
        movq    $3, 48(%rsp)
        movq    48(%rsp), %rax
        movq    %rax, 16(%rsp)
        movups  32(%rsp), %xmm0
        movups  %xmm0, (%rsp)
        callq   Accept(S)@PLT
        addq    $56, %rsp
        retq
```

Note that it constructs an `S` on the stack, then moves it to an adjacent place on the stack, then calls `Accept()`. The move is completely unnecessary — the `S` could have been constructed it in the target place.

(gcc wastes even more stack space, but without moving the struct.)

Demo: https://godbolt.org/z/55bozaf1K
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNVNtu4yAQ_Rr8Mmpk4_j24Ic22Uqr7lWttM8YaOKWGC_gpO3X74Dj5qJeFmEww2E4B2ZotHiuF7qzrZAGFoReYQWuhSTpJYmXJJ7aPB4rHzGj1TozcAe3QIq9BUDpbgUMSLqEhKSn5iaY6bmZB3P6aibF8vAf2q1uBVxyLntHaHkLltDqLcidtB6As8eUDgvHuZPFuNepwmOnC8WQX2-0GLi04NYS7rVSetd6kdbKTaOe0WTgqcwv8jnsWreGi5_0veNjdjNaDkwRCh8XQlMg8_hoyV7YWOzQ_B1h8ywndIE_mbH9KWijtxMo8ZiUBlcBeO7wCEs9dh7_FzYN2PJz7Blmz5g9vec5zCEqyT_0PfQWznWNvp82m_ht-DQZcO_55kwpT-U4jiq8kF_f7k6BTIjPb8JI9_eDkPuhncRAYw5ah5nYjTlmgXWAyFv8QHchEq1j_NHvgoPOK8IIxTVOeywTD4zLzkGvsH97iddlvddXYV5XHs_gDrHeIbQWOWx6JZ3EQB-6TmIeWGaegXyhpIxJNQ-OJ2pcD0rAmuHSRvotJgFSeG7tSMMxs5J7arOTPKHlinPYMetQjNwGXWbPG2yPeM--GVzINI090vTJOKrzO81e729sl3KjfY6tneutz0t6jXWlRaOVm2mzwtELflnW6Bd2n9xEsk7yvEyyIk6rSNSpqNKKRa51StZ_PDVxTAh2_ix7fA0CD9NuW6YuLq--wnR14VFIYaeNsIBvhZcUDUbVZ5QQNjQzPG8cKLWdugt8fx4kx_u5bq0dpPVkyyqNo3XNac5yllWsKCpB5yUXSFY2RVaWDU_yIlKskcrWJLsi2TJqaxpTmmCJy6xIyllRNSIpecVlwcU8zjGq5Ya1auY39ocTmTpwaIaVxUnVWmcPk170qpNy8s8GvBRT_zb8hT1-v4kC3zqQ_QeIe8ok">