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