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

    <tr>
        <th>Summary</th>
        <td>
            x86: missing jmp [rax] optimization on non-niladic virtual functions
        </td>
    </tr>

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

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

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

<pre>
    ```c++
struct x0 {
    virtual void y();
};
void a(x0* b) {
    b->y();
}

struct x1 {
    virtual void y(int);
};
void a(x1* b) {
    b->y(0);
}
void a(x1* b, int t) {
    b->y(t);
}
```
with -O2 or -Os. Result:
```asm
a(x0*):                               # @a(x0*)
        mov     rax, qword ptr [rdi]
        jmp     qword ptr [rax]                 # TAILCALL
a(x1*):                               # @a(x1*)
        mov     rax, qword ptr [rdi]
        mov     rax, qword ptr [rax]
        xor     esi, esi
        jmp     rax                             # TAILCALL
a(x1*, int):                              # @a(x1*, int)
        mov     rax, qword ptr [rdi]
        mov     rax, qword ptr [rax]
        jmp     rax                             # TAILCALL
```
The first function is fully optimized, but the latter two are not. I'd rather see
```asm
a(x0*):                               # @a(x0*)
        mov     rax, qword ptr [rdi]
        jmp     qword ptr [rax]                 # TAILCALL
a(x1*):                               # @a(x1*)
        mov     rax, qword ptr [rdi]
        xor     esi, esi
        jmp     qword ptr [rax]                 # TAILCALL
a(x1*, int):                              # @a(x1*, int)
        mov     rax, qword ptr [rdi]
        jmp     qword ptr [rax]                 # TAILCALL
```
GCC fully optimizes the third function, but not the second. https://godbolt.org/z/5xoxdb6YK
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVd9v2yAQ_mvwC4qFiR07D35wk3WqFmnS1Jc9YkMSKmwywInTv35n0qTLjzZVW20vQ1gH5ru77447UWq-zdGI7GaF6E0_yRSRwjrTVg53BKP06ReGsZbGtUzhtZYcbxHNEB2j4RMApdPD2gMYADqCaIFLwB1bKgdo-OWShd3iiER0hYRs3HUe0RUe5CKRc_0JBnfYvWzojMtusU_zbruRbokH3ynWBoQN8Q9hW-XQsDiBM1vv_hyS6c17l68MRIcYxeRI6UC1H7Vee2lY18f0a6MNxytnMEpuDJcomR7jH-qVl8dAUE6mF53fF3ezSTGb_UE-eg_56DPIv4r3MRzjO7iVfggre3wvLiYDdK8G8mIifCG9JR_n6Tio_tWsvD_qk-K_Xwo8l8Y6PG-bykndYGlhrdQW65WTtXwUvKdUttBpAFbMOWGw22jMjMCNdiG-QzTlwAXODbZC_O-bz--bt_bBh4P7573wsUhO6vvrZHJSzdaXsVtKML6v-X2BQzX7Uysq3fAQL51b2f4hoLcwF5qXWrlQmwXsHuFLOt3xcvTzW8DzIR8Pxyxw0imRd9moz18trZXNwof0HMQTE-a7DWajm0EjFeOyOjyoe2Y2aI3KT3jAg9WWYaVr2Ci13ovByugHUcEN3ILfVtieYRJno2CZx2nMSRozPhaMi1FCk3lSpmWVpkk5HtEsUKwUyubAElHaiA32JmANjAOZU0IpSaIkymhG05DEPIt5SgSJRUUiAXUgaiZV2PPoExSY3FMq24WFQyWts8-HDNKyaITw7sA-a91Sm7xQFTM68J5zz_w3STNW7A">