<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/143622>143622</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed optimization: Reassociate multiplies by constants to shrink said constants
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Alcaro
</td>
</tr>
</table>
<pre>
```c
int a(int b, int c, int d, int e)
{
return b*1000+c*100+d*10+e;
}
int a2(int b, int c, int d, int e)
{
return ((b*10+c)*10+d)*10+e;
}
```
Expected: Same for both.
Actual: a2 is a series of lea, as expected, but former contains two imul.
GCC also misses this optimization, but MSVC performs it. https://godbolt.org/z/1fs9xhsdb
The missed optimization also shows up on ARM and RISC-V, where a loads three different constants, but a2 reuses the same one. https://godbolt.org/z/qzMEv1b8j https://godbolt.org/z/bTYzY4vGa (and GCC optimizes mul by 10 to some shifts and adds, but that's a separate missed optimization)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycU82OnDgQfhpzKU3LFE0PHDjQnXS0h7nMRJFytHExOGsw6zIzmX76laE7s1lFihQJiU-q8vdTZStm-zwRNaI8ivJDppY4-NC0rlPBZ9qbt0Yc5PZ1QrZ2iqAEVumvBZ4gge4GzA2QwFrIVtwfhWwhUFzClPrbXEop8NhtUODRrEjgkURxXI98uMngH-oIrARW-kbcpZ4rNv_BPwn-CClk-_H7TF0kI4oWntRI0PsA2sdhlxpl23ZxUS5VFYJlUMAULDH4Hhyp5E0x0I0FT6CXmEhGCtD5KSo7McRXD3Zc3JX00-kEyrGH0TITQxwsg5-jHe1FReunG8_D05cTzBQSH4ONOxhinFkUrcCzwPOzN9q7uPPhWeD5IvCc91x_H9joTenzQJuI-Yl_U-fBvzIsM_gJ2scHUJOBx7-eTndfkv7rQIFAgfPKJIuBCIztewqU1uMnjmqKfLOqEAItWxoCTqP0E_3e8D-Xh48vua6-_bZTf_56-bp_-aTS0pPXNMZrKmIYFwf6DXIJ0QP7kYAH20deYyljfjiNg4oC77ddziqo-MsZCawz0xSmLmqVUZPf7-uyLqtDlQ2NrGu972td1nVe6UOdy25foSZTo6qKKs9sgxJLecglYpnLaldowrzU6tBXGu9NJ_aSRmXdzrmXMYXMLPNCTb4vDoiZU5ocrw8VcaJXWKsCMb3b0KRDd3p5ZrGXznLkd5poo6Pm4Rd5ihYeSTH7zq6RFxft7NJd1m_v-1ynNwQ7_Q2srHkvZEtwzf92ZOOw6F3nR4Hn5OD6u5uD_0ZdFHhefXO6mFuwlwb_DQAA__9nE22Y">