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