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

    <tr>
        <th>Summary</th>
        <td>
            __builtin_memset_inline emits call
        </td>
    </tr>

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

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

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

<pre>
    The [docs say](https://clang.llvm.org/docs/LanguageExtensions.html#guaranteed-inlined-memset):
```
Guaranteed inlined memset
void __builtin_memset_inline(void *dst, int value, size_t size);
...
but also guarantees not to call any external functions.
```

In the following program it emits a call to memset:
```
void my_memset(char* dst, int c, unsigned long n) {
  for (; n >= BLOCK; n -= BLOCK, dst += BLOCK) {
    __builtin_memset_inline(dst, c, BLOCK);
#ifdef ASM
    asm volatile("" ::: "memory");
#endif
  }
}
int main() {}
```

```
$ clang -v
clang version 16.0.0 (https://github.com/llvm/llvm-project.git cb5d0b41baf2f137f377a8d03481d6a5574a31ec)

$ clang memset.c -O2 -DBLOCK=64 && objdump --disassemble=my_memset a.out

0000000000401130 <my_memset>:
  401130:       48 83 fa 40             cmp    $0x40,%rdx
  401134:       72 09                   jb     40113f <my_memset+0xf>
  401136:       48 83 e2 c0             and    $0xffffffffffffffc0,%rdx
  40113a:       e9 f1 fe ff ff          jmp    401030 <memset@plt>
  40113f:       c3                      ret    
```

Changing BLOCK size does not affect it.
Only `asm volatile("" ::: "memory")` prevents the call.

@gchatelet @melver 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVVU2P4ygQ_TXOpRQLg79y8CHpzKxWO6s-7N4jbHBCD4aWwZnO_votsDsfvdMrjYViKPCr94qqSmvFpfn7JCEpdsJ2Dhy_JMU-ofXJ-1eXsG1Cv-LoNDfHVOvzkNrxiIZwGF_f0Dzxo_zy5qVxyhqXnvygE8rQPHLjpRRrZbQy-B7k4KRP6CbAkn1CtklJlhGXv12_geUbWL6J22erBBwO7aS0V-Ywbx3mk8g4bid0Kxz6eEIED2euJxkWTv0jDz6-ov_djJim6TxpJw9cOwtX2g6M9eAtdFxr4OYCEjWOhmvoJ9P5qPWnKubf3w14jGtvtbY_lDnC62iPIx9AeZCD8g74DI0uFpGfRCXqGi6H9_DV3YmPqBPuhHZhMuENHEPQtEV_BoVCUi1KAZmMGJ0atYOBhH1J2B52356f_pgt69saoRAaD-_ubA9Y8D_XsLCKjN6_vQYcE0P1Qvaw_evPGxh3A5yt5l7pgJBQigNCPOJAJhS92PESdx7QpBGqf0dKqv2y8T4JsRm4MhF1lnA987Nb-2ikOcTUh_V5tsyrsxxDskNWpiQl8J9yOSp_mtq0swMuQtUsrzUmwYvsfIoHoGsLQdo8a3lP-4xVPasqXgvC8joTJS-KKucsk11QfE_xymmOfNrB-pnCer9c5r7MkVCJA2z7IqbhFdZroRx3Tg4tBpjtr8kEPLWTv0cn1ycnWcZQG3u65V7Imu17tOcD0bDJa6gZ9ByNcH3Q3qH3MKM5ecsJpkRCi1G8PUDkM0RFgWzgw4P2lzbO4tH-kQ7dkbc-kLqHK-8ZSQrdIyNuxJVR__B0n_DjM6DcQJ9BjyXdh3HjN0vEo2QJ10wuJ6_afyTXz1gd-yh0xhrxSuLs0wR9OuHNh3YSbzs2NBB26Va87zG5sMMsjenZ6AsgwK_WV0mwW8mzNNilQhMLfSp9yMGcHLELeamRMC4GqbEkYCWbrCw2OStrWq5Ew8SGbfjKK69l80nHWJphcLGaRt38WiHhUjk3yfBfVJR1Va5OTVdlXZbnfVfnJc0qLK08L-qK8Q2reZvlK81bqV2Df3mo18gfECGC9mK_Ug0llJKa0AxLgBYpIxJntCiEYJuuqlCuxJair_-Gq7GJlNrp6HBTK-fdbRPLLjRlGd0hPp_8yY6NOF-m7_a8iq6bSP1f-O0kwg">