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

    <tr>
        <th>Summary</th>
        <td>
            Stack-returned struct prevents tail-calls and moving operations to registers
        </td>
    </tr>

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

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

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

<pre>
    ```C
typedef struct {
  long long a, b, c;
} S;

S ext1(void);
int ext2(int);

int f() {
  S v = ext1();
  v.a+= v.b;
  return ext2(v.a);
}
```
```asm
f: # @f
        sub     rsp, 24
 mov     rdi, rsp
        call    ext1
        mov     rdi, qword ptr [rsp]
        add     rdi, qword ptr [rsp + 8]
        mov     qword ptr [rsp], rdi
        call    ext2
        add     rsp, 24
 ret
```
https://godbolt.org/z/zdr339Ke6 - gcc does a tail call, and doesn't store the result of the addition.

A related scenario is a stack-allocated value whose lifetime ends before the `return`, e.g.
```c
typedef struct {
  long long a, b, c;
} S;

void ext1(S*);
int ext2(int);

int f(int a) {
  {
    S v;
 ext1(&v);
  }
  return ext2(a);
}
```
https://godbolt.org/z/fz58qWcos - gcc again tail-calls when clang doesn't.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVE2TozYQ_TXNpcuULAGGA4fxuHzJ0YecBWqwEhl5JcFk59enBPYYO7tJKhWXkVA_9We9h_Re9wNRDfke8kMix3C2rlafUl9k0lj1vYaCLf93YAdgb-H7lRR16IMb24Cw2y92RGOHflkk8Hds4tKCuOGwO-DpcZrXE9IfYQu8nKxWwKsvWA8hQhx4qYewRh54B7wEXq0rOOGEIA73qGs_xCmVwPcRntJmZXcURjfc0823qnXVt5f7GF6O0l8WSwfiDYELhIx199jLz4_NvDt_jTPh2Q2-2GmxKx3tEX7ya6UxcZ_beUJePL99WKfwGhxCvo9h8sPzfanU391H4Hss_-J1z_Kj8LFepX9aL_9J_pcJOAo_HO85hKsH8Qb8CPzYW9VYE1LreuDHz_goJ0T1CxW4wb5tUVnyKDFIbeYqYhI5qNk-AN8F9ME6wnAmdORHE9B280kqpYO2Q7qmVyzMyEAKfUuDdNqijvF9kO3vG2mMbWd0kmYk_DhbT2h0R0FfCGlQHhvq7vmgYAvFYnf8HSnt05em2_9fWlFRdx2cgL_9F3XFXb5IbPU66-0hpC_RFdOz8L409Kq1f6W0f6JC95mX335trb9RQfZSDzMTNpEJHj_ONGBr5NA_6JAmqhaqEpVMqN4Wu5JlVbkTyblmTSMpK4stk7xoKsayclt2ohDFTm3FViS65owLJljOWb7LRZpnGStJyrzLGxIFg4zRRWqTGjNdYqGJ9n6kuthuqzwxsiHj5-8t5wN94AwC5_Hz6-ros2nG3kPGjPbBP6IEHQzVp5mCyxwjPxeqXB1NNAS_7jvy_2InPfRor-RkZLnHYNFRr30g55PRmfplvjqcxyZt7QX4Maa-bZurs79RG4Af54I98OPc0J8BAAD__9itwsA">