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

    <tr>
        <th>Summary</th>
        <td>
            Inefficient Stack Usage in Creating and Passing Large Struct Argument
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          jonathan-gruber-jg
      </td>
    </tr>
</table>

<pre>
    When creating a large struct and passing it as an argument, Clang stores the struct on the stack twice. By a "large" struct, I mean one that is too large to be passed as an argument in the argument registers and must instead be passed on the stack.

A minimal test case is in the attached file test.c.txt (GitHub would not allow me to upload it with the .c extension, sadly), reproduced below for your convenience:
```
struct S {
        void *x, *y, *z, *w;
};

extern int extern_func(struct S);

int tail_call(void *x, void *y, void *z, void *w) {
        struct S a = { x, y, z, w };

        return extern_func(a);
}

int non_tail_call(void *x, void *y, void *z, void *w) {
        struct S a = { x, y, z, w };

        return ~extern_func(a);
}
```

I tested the target architecture x86_64 but am unsure if any other target architectures have this inefficiency.

Host system: Arch Linux, x86_64.

Clang version: official Arch Linux package of clang, version 18.1.8-4.

Command line to reproduce results: clang -c test.c --target=\<arch\> -O\<opt-level\>

x86_64 assembly (Intel syntax), with -Oz, -Os, -O2, or -O3
```
tail_call:
 push   rbp
    mov    rbp,rsp
    sub    rsp,0x40
    mov    QWORD PTR [rbp-0x20],rdi
    mov    QWORD PTR [rbp-0x18],rsi
    mov    QWORD PTR [rbp-0x10],rdx
    mov    QWORD PTR [rbp-0x8],rcx
    movups xmm0,XMMWORD PTR [rbp-0x20]
    movups xmm1,XMMWORD PTR [rbp-0x10]
    movups XMMWORD PTR [rsp+0x10],xmm1
    movups XMMWORD PTR [rsp],xmm0
    call extern_func
    add    rsp,0x40
    pop    rbp
    ret

non_tail_call:
 push   rbp
    mov    rbp,rsp
    sub    rsp,0x40
    mov    QWORD PTR [rbp-0x20],rdi
    mov    QWORD PTR [rbp-0x18],rsi
    mov    QWORD PTR [rbp-0x10],rdx
    mov    QWORD PTR [rbp-0x8],rcx
    movups xmm0,XMMWORD PTR [rbp-0x20]
    movups xmm1,XMMWORD PTR [rbp-0x10]
    movups XMMWORD PTR [rsp+0x10],xmm1
    movups XMMWORD PTR [rsp],xmm0
    call extern_func
    not    eax
    add    rsp,0x40
    pop    rbp
 ret
```

[test.c.txt](https://github.com/user-attachments/files/18174500/test.c.txt)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsVk2P2zYT_jX0ZSCDomSvfPDBa7_7ZoEEmyYt0tuCksYSNxQp8MMfOfS3F6Tkr23SbW9FUcAAxfEzDx8OZ8jh1opGIS7J7J7MNhPuXavN8kUr7lquksb4Ek3y0kxKXR-XX1pUUBnkTqgGOEhuGgTrjK8ccFVDHwhVA8IBt8AVcNP4DpUjbA1ryVUD1mmDFlx7dtRqnPHqK7i9qHAK90fgQBiLKxDGRmygeYQOuQKtEFzLHQgLTutRi9NQYpSB9SsJIIZ1znODjbAOjY3SO28DxDrk9RXHtbgpoStCVyvohBIdl-DQOqi4xSDiRO8cr1qsYSskRsS0mrqDA8KK_wv3zpew117WoLQDLqXeQxd1-15qXofQ7YVrI9e0Ajw4VFZoFbZueS2PhC3Ct8He6NpXGNQGlq02cNTeQKXVDpVAVSHJgmAyp-OPrsaYfwZydx-3s9hpUQNhq0NgJWx1HMdv47gnWUTebcYPugqijAKhHAyfz1uvKsKKE3vQeAIHlONCPldcSsKKm_VOk-P15Nv1ZE_Y4iL2LJ8DyTbBDpEn-ke_PVwrJXRh0HmjXgnlF4V3m4tOpdXzP0Drb2-IvTpPQlePMcuwjinjQhk44KZqhcPKeYNwKObP8xxK74B34JUNRrEFro6gXYvme14WWr4LJRZTG7dbUYWUOo5F8E5bB_ZoHXYkW8HKVC28F8rHHQ4Ljsih7HdoYhZnK9CRi8srJ-h59ZU3CHoLVcDHqA4ukBbTdFokZz7ddaFgpVCxbs6FAAatl86GNSIJJNVYgJAkwxZJtiGzNcnWYavx63-QPA0m3btE4g7lYB9WG2MXLoOulMdQxY_KoQR7VI4fxmKMFZs8xUNNnuwwsDBoA8lT9urQLikW6xN6b1sAMGUfZgDQ6R2MBrY29mS2voxmG8z0kNNb-E9fnj5t4OPPn4DM7k3ZJ_TAKJltAkct3sSmxYi1fwF75j28iT3RVldQ31s4dB0lbP3rhw8_0v0anv4Inv4R_hoXYnZ_ER7Z3nI4IU9xDkd2c5EMZl7X3z2WXvdwc6wG3ZBVt_fMf0nwL0iC8JwDAPLD38qKMSVub3Qyu780DlFA0TrXh5uNsAfCHhrhWl9OK90R9uAtmmRoO0JfYwl7CL1HGNMivctnlBL2cEXIFpN6mdWLbMEnuEzvsjxf5LRgk3a5LQo6S-tim1dpPS8qdkczWszpoipni5zWE7FklOUpSwuazfKcTZEXWNJ8m875tsjnGckpdlzIqZS7bqpNMxHWelymjGazbCJ5idLGfpMxhXuI_xLGQvtplsEpKX1jSU6lsM5eaJxwEpeP56fIwefYMf5iw8MhFKzPjamq4ePYib6PbeHn4Sleja3fxBu5_JOIhjXHIemNfsHQeT5EpTGqw1Z2S_Z7AAAA__95pmcJ">