<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/146303>146303</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
missing tail call optimization on RVO
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
rockeet
</td>
</tr>
</table>
<pre>
```c++
struct Slice {
const char* data;
unsigned long size;
~Slice();
};
Slice get_s_impl();
Slice get_s() { return get_s_impl(); }
```
clang produces:
```asm
get_s():
push rbx
mov rbx, rdi
call get_s_impl()
mov rax, rbx
pop rbx
ret
```
icc recognized tail call and produces:
```asm
get_s():
..B1.1: # Preds ..B1.0
jmp get_s_impl() #7.24
```
g++ also missed such tail call optimization.
If delete `~Slice;`, g++ & clang recognize the tail call, but icc fails.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUU01vnDAQ_TXmMgoyNiy7Bw5sopV6atVKvUbGHsCpwcgfaZtDf3tl2CQ0aQ9FlmzN87x5bxgL7_UwIzakOpPqLhMxjNY1zspviCHrrPrZkAPdliTsnBZtfXBRBvhitEQgdQoBAEg7-wByFI6wFpQIgvAVi_NaRoGx8wBeP-EVAIBfKwthR8JOW5TUd9th4x8w3Pt7PS1mf2mHbeGkAxyG6Oa_pUBipe2LGUJbacQ8wOKsihI94e0eF34itN3xbzgs0Y9Jtut-XA2kb7KP8Bxlt-CU3oFSGJP2d6po-5ootsQ_WBe7wPtaDsMbI1pKcCjtMOsnVBCENltRMav_9Jfn5yIvCH-p9u4jjMMnh8rDepfulD1My_X01mrKqnNWvhE-bBMFwngLk_YeFfgox50FuwQ96ScRtJ3zlE7bDz0oNBgQyIFex4efEyO7hWdKwg6w_eCXzkAY8ZU5Xe5igNS8Xmjj80w1XJ34SWTYFHVVsIoXNcvGhnNZYoEV78sjl8ey6HrFu5PCvjgUfVFnumGUVfTAKeUFq1helqLsadfXJdZYno6kpDgJbXJjHqfcuiHT3kdsivLAKc-M6ND49REyNuN3WFHCWHqTrklJN10cPCmp0T74V5qgg8EmtU7Pwz_aBnaGz18_ZtGZZgxhWUeBXQi7DDqMsculnQi7JM7rdrM4-4AyEHZZlXjCLlepjw37HQAA__9hzDfO">