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

    <tr>
        <th>Summary</th>
        <td>
            constant propagation can pessimize libcall optimizations.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    This case just came up in the context of the Linux kernel.
https://lore.kernel.org/llvm/20220511160319.1045812-2-mailhol.vincent@wanadoo.fr/

Consider the following code:
```c
#define CONST 0x01000000

// try removing static
static unsigned ffs (int x) {
  int r;
  asm("bsfl %1,%0"
      : "=r" (r)
      : "rm" (x), "0" (-1));
  return r;
}

unsigned int foo(void) {
  return ffs(CONST);
}

unsigned int bar(void) {
  return __builtin_ffs(CONST);
}
```
It looks like constprop sinks `CONST` into ffs when ffs is static, but if it wasn't then constprop wouldn't sink CONST.  instcombine will fail to optimize `ffs(CONST)` into 25 since dead arg elimination will remove the parameter after const prop.

cc @fhahn @efriedma-quic 

We're fixing this in the kernel by changing our ffs to dispatch to __builtin_ffs after a __builtin_constant_p check.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyFVE2PozgQ_TXkUgoyJiThwKGnWyOttNo97Eh7bBlTBE-Mzdqmk95fv2VDZujRaJZE2K4qXr36cmu79-bLoDxI4RG-zj7QbkSYJ1AGwoAgrQl4D2D7dPxdmfkOV3QGdZ6xl4w9DSFMPiufMv6Z_to6zFe9dZco0W8jLZxxzqqiKI6sLOq8YIfqXPA9349C6cHq_E0ZiSZkB3YTRnTW5r2LmMnJ8n62xqsOXaLSW63tTZkLcewwElgsj2z5y_XMyw57ZRCe__zjry_A7qxg6dkiL-QhuHdwONq3COuDCGpFWfYwk_-LwQ763kPGz8oEuGe8huz0aTEEiDKXld_OwlP454zz1veaPqqKjD_Twkj0sIkPRQBRVL5Q2Dyi01r_xMKNqz56JqwoY6toXyRZvfHvMMzObChlp5dt6N9iisR7awnlzaruh6hWFIqb9CmTWy-_gmyF-yXk62s7Kx2Uef1f8Edpl-NvAbS1Vw9aXVOj-jA5O4FXhoRktiAdWaRhU8luA6YYgFp-LS_lr50DqB5UgJvwJuOnEBvMbCBvdtbdoonoSyvlsdY-SDu2sb1uSmvoqZmBnNkpqFH9i5HGD2E9-PAqYkmEDkUHwl0ANX1jiJU1C1pqRUzdPglHgxmo90Uf34kbRHL5NvNSAg1QP4jBxA32TmE3iv0_M3Xv1vBvpGgcTZG6x14P8RJYR36ZXmjfQQ7CXKLazi6ljWh3yk8iyCHuP5RuJSY20kRSmPA6ERTKa77rmrKry1rsggoam4dBCkRcltClMDCh90sCtWqloFysGU0mPt_NTjcfb56LCsPc5lSO75dOXPaE_RVloKPyfkYqxueqKuvDbmj6ozyiKCQeZXWu-hOr2rI98bZi9JPHaqdFi9o3WfWJBiyBlk8fmMSJXUZwJHTs9lttVFYvO9U8Lj9elFV1yLHAsmU1O4nDqa_lOVYqXoN59BCvzZ1rEvV2vnhSauWD_64UPo0XJlqEL-YwWNcYJa8dejFro9D5XYq2SaH-B34_1G4">