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

    <tr>
        <th>Summary</th>
        <td>
            Clang -fms-hotpatch elides memory allocation calls
        </td>
    </tr>

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

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

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

<pre>
    I built my application using clang-cl with optimizations enabled and the `/hotpatch` flag (to try out Live++). It compiled and linked successfully, but when I try to run it, the very first memory allocation hits an `int 3` instruction. It seems all the memory allocation functions (default `malloc`, default `new`/`new[]`, custom `malloc`/`new`, etc) are just a `nop` followed by several `int 3`s. It seems to have assumed it's unreachable code or something?

For example, a somewhat reduced test case (and here's a [Godbolt link](https://gcc.godbolt.org/z/Ed8fd5arh)):

```c++
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);
}
```

When buit with `-O0 -target x86_64-pc-windows-msvc19.38.33133 -fms-hotpatch`, it yields fairly reasonable (if unoptimized) code:
```
"?mi_new_test@@YAPEAX_K@Z": # @"?mi_new_test@@YAPEAX_K@Z"
        sub     rsp, 40
 mov     qword ptr [rsp + 32], rcx
        mov     rcx, qword ptr [rsp + 32]
        call    mi_new
        nop
        add     rsp, 40
 ret
"?builtin_malloc_test@@YAPEAX_K@Z":     # @"?builtin_malloc_test@@YAPEAX_K@Z"
        sub     rsp, 40
 mov     qword ptr [rsp + 32], rcx
        mov     rcx, qword ptr [rsp + 32]
        call    malloc
        nop
        add     rsp, 40
 ret
```

When `-O2` (or indeed any `-O` flag higher than `0`) is used, it  emits 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
```

What happened here?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVkuv4jYU_jVmcwQKDoGwYMHlDtWoldpdHxvk2IfEU8dO7WMe8-srO9y5ML0zHamLKYoA2ec7j--8IkLQrUXcsOqJVc8TEalzfkNX2blJ49R18x6aqA1BfwUxDEZLQdpZiEHbFqQRtp1KA2dNHbiBdK8_ZoEAaEVjUIGwCqhDYMuC8X3naBAkO7Ys4GhEC4zX5ID8FVwk-EmfkPGn_Kxn8J5Aun7QL3qMtn-ighClxBCO0Zgr4ztoIsG5QwvvsyJy4KMFTekumT6hv8JR-0DQY-_8FYQx7hZJpymAsMk_bQnK5Jm2gXyU6T47ERD7kEBZ3T91HKOVY9SM1wqPIhpKCvsskyPfwd25xfNIx-1_Jv8mJmMg13-G3t-BdoAkGV-D8AgfYiAQWacbMqnOGHdGBc0VAp7QC3MfWriLhxx04oQgQog9qkzYKkC0HoXsUvZAOoXgPATXI3Xatqzcs-KZFdvxe-884EX0g8HkmMiC504QeFRRogLCQCBFwERNymGHHrMdAax6-sGpxhnKmU0c8LojGgIrtylovm-lnLWjzMz5lvH9R8b371R9VJXwHePr9JTbe6cSS_mRt1LKp3QdUOERos0lr8A4245fQX_EA7Hy6V4LXgi9Bcb5jnEObHW7BQA4Oa0Y30KvDykrvB41ZEXZnxdNq-d7lQkGjG9H2CFR84qVLlpK4BvyzpxHit6-Wvsk-i92cudqexgL6Rvt3YwdDo_or5t9Yfzei19TRzZR0zgd2LKY_lzAlIRvkeBSLw_LxXSQ07O2yp3DtA8nOV_PynpWlvOyhOmxD9O7eZEKTBNcNRoV4Ci0N1fwKILLkybVl07pvY0hVKlHUgG_lsdnbnLOyv19MhYFWxS_b395t_3t8CNbFH9kkS0wXkK6_DbAp7ylT4hN_vVhSAEsbrahd6d8_tfZeQUD-dQNPgzA-BOUPPfCDry8PKp7gaULvvsa-gEm0-xK8LGEHu7S4Hg4EEq96bJHuifurer6EoHp80DiN4P_z2SOjfFfyfxi7-SO4WmoM147D9oqzIvwOl592qGdbjv0QN24xrIyvgYdIIbUBrlvAPu06ajT4bs2xEV2bSYmcy4uD5P7exXWF5x6OzWCoBPDgGmJ5G1W7idqU6p1uRYT3MxXxaLkyzmvJ92mKetjJTgvqmq-LObrel5WC5TLleK1kmI90Rte8EUxL0peVhWvZ005ryucF2uUkldzZIsCe6HNzJhTn3bgRIcQcbNa1qv1xIgGTcivb5zn17EUW_U88ZskP21iG9iiMDpQeNVAmgxudkn8ccwCGq0wvPGKk4o-TKI3m88WtKYuNjPpesb3ycDtZzp49wElMb7P_gbG99nlvwMAAP__N1oPMQ">