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