<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/84089>84089</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed Optimization: Block Placement Reveals Missed Constant Propagation in Many Archs
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Geotale
</td>
</tr>
</table>
<pre>
Example code:
```cpp
#include <stdint.h>
typedef uint32_t u32;
u32 fib(u32 n) {
u32 a = 0;
u32 b = 1;
u32 c = 1;
for (u32 i = 0; i < n; i++) {
a = b;
b = c;
c += a;
}
return a;
}
```
On compilation, Basic Block Placement will for many archs end up separating:
```
early_exit:
$a = MOVi 0
exit:
$return_register = COPY $a
ret
```
into:
```
early_exit:
$a = MOVi 0
$return_register = COPY $a
ret
exit:
$return_register = COPY $a
ret
```
Instead of just propagating the constant to the returning register!!
List of tested archs which are affected on O3 (unless specified otherwise):
- Aarch64
- Many 32-bit ARM archs: v4T, v5T, v5TE, v6, v6T2, v7, v7A (Outliers: v6M, v7M due to loop unrolling, both of which are affected at -O1)
- LoongArch
- RISC-V (both 32-bit and 64-bit)
- XCore
Tested on Godbolt Clang Trunk
Godbolt link: https://godbolt.org/z/5roWa3z71
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVMlu4zgQ_Rr6UrAhkfKigw5e4kYDbTjIBD0zp4CSShY7NCmQpaSTrx9QtLJfGhiB4FLre8USpffqZBALNt-w-W4ie2qtK76hJalxUtr6qbj6Lc-dRqhsjUysWbJjyZotkjiqrrtIuFCm0n2NwMTWU60MzVomrqKanjqssYFeGRL8jqAXnInNxXeYe8GhUSXjq7AzjOfAlhcLAAgeIIGJHSQvnqO8HOTpJ3n1Qf6qbayDSyr1EnTYbsEMW8Y3w_gAI3wRRvkuXfgijOqTvIIQSexAvlOx5e4dLIfUO_PG6NVgrHc8Hg1U9twpLUlZw_gWNtKrCjbaVvdwrWWFZzQEj0rrgelZmieQrmo9oKmh78BjJ50kZU6fLzUeUTr9dIe_Fb1YADCeRfKH408Fo-U7G8azSOTO4Ul5Qjc4bI_X_w7uYyiH9GVeZcj-CaYvIcGfw_h_WXw3nlDWYBv41XuCztlOnoaCA7XhdzKepCEgO5xjsqAd8zGehvGmQX4oTyEgoSesL_f52KqqBekQZNNgFRTWwFEM3W00eg--w0o1KmioRfeoPDKev3CdwjqEWmTj8RC6RfBpqQjWN4eYiIk1PGS3odke5uNyNayLON_yYV3GOZRwdexJK3TReXGImgPUPQbe2toOeuOs1qEP-RZKS21g-AUpSTA9pgH3BeUPa81p7ap2FNx8_2s7_RnSDmEuBKSpYZGF7Rvff7bW4dvS3saSWgPfbF1aTbDV0pzg1vXmPpqMCq3MfeDTEnWBGON7xvenqJ1Zd2J8_8z4fu7s31I8L9NJXYg6F7mcYJEuk3yxzJOFmLRFVjcNn8_T1TJPeSZEKiXisknThVwJbJYTVfCEZ4lI5pzP00TM0lWSlpiLNM9wXtcVyxI8S6VnWj-cQ-6J8r7HYpUlq3yiZYnaD4875wYfYVAyzsNb74rgMy37k2dZopUn_xqFFGksDsp7rOHYkTqr5_jWiPWnV-YGH1BqDxfz7djZ12PLWwPKxK4K9-UnvdPFh_IpavtyVtkz4_sA47JMO2d_YUWM7wfwnvH9QO6_AAAA___HK-_T">