<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/78099>78099</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang] Inconsistent optimization around constant 1.0f
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
kaimfrai
</td>
</tr>
</table>
<pre>
Given a simple switch which uses the constant 1.0f in case 0, the optimization is different than with any another constant, e.g. 0.0f.
```
#include <utility>
auto Switch(long i, float f)
{
switch(i)
{
case 0:
return CASE_O * f;
case 1:
return 2.0f * f;
case 2:
return 3.0f * f;
case 3:
return 5.0f * f;
case 4:
return 7.0f * f;
case 5:
return 11.0f * f;
case 6:
return 13.0f * f;
case 7:
return 17.0f * f;
}
std::unreachable();
}
```
Compiled with `-std=c++23 -O3 -DCASE_O=1.0f` and `-std=c++23 -O3 -DCASE_O=0.0f` respectively. The former leads to a jump for each of the 8 cases, while the latter is able to optimize to a single multiplication with a constant defined in a table. The latter appears to be more efficient, especially if it wasn't 8 different cases but 256 or more.
It seems to me that the 1.0f * f is optimized to f before the switch could optimized to table[i] * f. This also happens with -1.0f.
See https://godbolt.org/z/K4EdfzW4q
Side note: The example above is a simplified reproducer of what I observed in a more complex scenario, so optimizing it myself to table[i] * f is not a solution I can use.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVV1v6jgQ_TXmZQRKnISQBx5oKatqH-5DV9rHlRNPyNx17KztwKW_fmUnLaUq1UWID2fOmTnzZeEcHTXilhUPrNgvxOg7Y7f_CupbK2hRG3nZ_kEn1CDAUT8oBHcm33Rw7qjpYHTowHcIjdHOC-0hXSUtkIZGOISE8cf42AyeenoVnowGciCpbdGi9uA7oeFMvgOhLyC08R3ad7qAx9VxBckqaVcs2bNkN3-uk_k9_eUZ6UaNEoFlj6MnRf7CsqePEDF6Ay8xfMY3yugjUHDQKiM8tIxXs3X5MP0AgFku4xt6fw43BrPQbHc9Ci-LfrQaHncvT__8AMZ30LLsMyy9wmZ7HtJ3x5rfc5J9A8rugYpvQPk9UPkFKCKKe4g0_cbP-i7qO0nlXdRX4QEAK_cf-wCcl4Ei243aomg6UStkfBMK_Aa7Qm777NH0AymUU8uydbKMZPuG8QfGH3gGyx8ZLPdT3Vm2D_LZOgGh5e-YJ7O5RTdg4-mE6rKCvzqE1tgeLSgU0oE3IODn2A_hGIIGMG2ctE3MkQt9fe5IYTxUwnu0YfCC1ICeBxInJkf6qBD6UXkaFDXTnE5TeR1tiS1plGG6BfjANEU2s4thQGFjbDVCbywCti01hPMcB0UklLoAtUAezsJpxksPmw_7IEYP9eiBF2swNhLdTP6zB4fYR0d90Cd8FHlttCD0TaAMZi3U2IaAgt28wBozKnlrFjWx4oFYsZ-YgsCQNeUMdEGgdlNalunnhfSCCJ33gwutxQ-MH45G1kb5lbFHxg-vjB_-zJ9k-_p3_t8NkCSCNh5Ztov5xF8iblpRmxPGok27l1pCCRYHa-TYoA0lPwf1z2Bqh_b0VpuY-8YEkl_gGtTCkgklcO-Fp7D8PPQXh6r9WnvwrI0P3o0aY0c8QyN0WPo3yhdym8kqq8QCt2mZFDznZZkuum2VtjLbFHJdyVqsccN5XgiRFsk6LWWSVQva8oTnSZrmaZ7xIl2lZVGXmzSvy4pnVdWyPMFekFopdepDIhfk3IjbcpNU1UKJGpWLlxfnjRL6yDgP95jdBvtlPR4dyxNFzrsrgyev4o33GBHFHp516HFyPjTgzVUlrBm1vL3dFqNV20-VJt-N9aoxPeOH4Gj-Wg7W_MTGM36IcTvGDzH0_wMAAP__5fE9EA">