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