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

    <tr>
        <th>Summary</th>
        <td>
            Clang miscompiling code when using -fms-hotpatch and optimizations
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    When using the -fms-hotpatch option (which is a requirement for Live++), the tailcall/sibling call optimizations will lead to clang miscompiling function calls.

Example code:
`typedef unsigned long long size_t;

extern "C" {
    void* mi_new(size_t size);
}

void *mi_new_test(size_t count)
{
    return mi_new(count);
}

void *builtin_malloc_test(size_t count)
{
 return __builtin_malloc(count);
}
`

Using -O1, the code will compile to the following:
`"?mi_new_test@@YAPEAX_K@Z":             # @"?mi_new_test@@YAPEAX_K@Z"
        jmp     mi_new # TAILCALL
"?builtin_malloc_test@@YAPEAX_K@Z":     # @"?builtin_malloc_test@@YAPEAX_K@Z"
        jmp     malloc # TAILCALL`

However, adding -fms-hotpatch, the code will miscompile to this:
`"?mi_new_test@@YAPEAX_K@Z":             # @"?mi_new_test@@YAPEAX_K@Z"
        xchg    ax, ax

"?builtin_malloc_test@@YAPEAX_K@Z":     # @"?builtin_malloc_test@@YAPEAX_K@Z"
        xchg    ax, ax`

As a workaround, specifying -fno-optimize-sibling-calls will produce the correct (but suboptimal) following code:
`"?mi_new_test@@YAPEAX_K@Z": # @"?mi_new_test@@YAPEAX_K@Z"
        sub     rsp, 40
        call mi_new
        nop
        add     rsp, 40
 ret
"?builtin_malloc_test@@YAPEAX_K@Z":     # @"?builtin_malloc_test@@YAPEAX_K@Z"
        sub     rsp, 40
 call    malloc
        nop
        add     rsp, 40
 ret`

Please refer to this godbolt compiler explorer repro: https://gcc.godbolt.org/z/r86nYbqvo


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVk1v4zYQ_TXUhbBB0_LXQQdvskKLZtE9tGi3F4MixxK3FKnlh-3k1xekFFtq0m2APUQwRFjkezPznjgic07WGqBAqw9odZ-x4Btji09GAQ-K2U_Me7Auq4x4LP5oQOPgpK6xbwDPjq2bNcZ3zPMGm85LozGi23MjeYOlwwxb-BakhRa0x0dj8YM8AaIf0m-H6F3i8UwqzpRCtHSyUpE-_k2MrXxikdfhs1QKK2ACe4O5YrrGrXTctJ1MkGPQPGUQsW6OyD0i-_7-8cLaTgHmRgBaDg_RmvjHDgQccdBJBIGV0XV_c_IJDh4tP4x54OLBxhLpHaIUo80wizHGJyMFonvcyoOGM6LbniERxVqvTJv7MWWEYUT3PezgwfkblpugfQQPyFE4Cz5YfYt2Xfo_caoglZf60DKlDH9jvCHY4TBFfz_smozj_57emtmvi2fToxe9p72FEG2NE0ejlDlLXY-dQpSiZTkWKScoJ1_2nz_u_zz8gnLyV1qStLleiC5xXPg28FXbeH1tuzT2qMT02_7nh7v9w8OQVCJ9Tc7vZTbJ6M3g1zNLqGlmU81_Mmc4gY2KMyGS_uMd-9KJ634azJDuXT248KaOI7ukEi7j2t5N_hdJTTXfx653NvZvZk3QIq5xHXB5fOz112Y2tDWYDc1ulhpW70BnjQgcBl-sBe5jR62Cxy5UCckUorvbLnnR1N5u0w9Y40KVRuu6WGJOptOpfQ-9aTKhTTd9wIR4lciCf2ej_6vEVNt1__1AedMX57MC5gBbOIJ93n24NqIyyj-3SIvh0iljwWILnTWx2sb7Lm1TWiJa1pzPB9Dc2BrR8gnR0m7X-kv17WTGATNRLMVuuWMZFIsNyZebDVmvsqYAyCtGt2wtci4EVILnnK34erVjpAKSZ7KghOZkQfJFTnJK54zTakkWW5ZvKV2IDcoJtEyquVKnNuaRSecCFJv1brXNFKtAuXTgoDR9yKP2q_vMFnH9rAq1QzlR0nl3Y_DSKyjuXn73-_Z1O5lMTyVMi-k5IgtWFf8STfomVHNuWkTLGHAYZp01X4F7RMuUv0O0TCX8EwAA__-xtrfF">