<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/73599>73599</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[missing opt] redundant loads of variable addresses after a loop
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jnk0le
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/ab5bhT55P
It seems that after a loop llvm is forgetting that it ever loaded registers with some addresses.
Putting additional code in the loop bodies (e.g. increment volatile global) seem to not change anything.
Loop entered conditionally seem to not trigger this issue.
riscv32: redundant `lui`s everywhere
armv7a: `foo1()` has 3 redundand pc-rel constants for `a` address (5 total) , ` foo2()` and `foo3()` are fine
mips: even worser than riscv (due to zero offset loads/stores only in `foo2/3()`)
armv8a: everything is as it should be
x86-64: it really likes to spam 10/11 byte instructions everywhere (at -Os and -Oz of course)
GCC has this issue as well:
riscv32, arm32, arm64: only `foo1()` is fine
for reference here is a bit more real code that experienced this (requires stm32f0 headers):
```
void init_clocks()
{
FLASH->ACR = FLASH_ACR_PRFTBE | (FLASH_ACR_LATENCY_Msk & (0b001 << FLASH_ACR_LATENCY_Pos)); // 1ws
if((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_PLL)
{
RCC->CFGR &= ~RCC_CFGR_SW_Msk; // switch to HSI (0b00)
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI);
}
RCC->CR &= ~RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY)); //!!! reload happens after this
RCC->CFGR = RCC_CFGR_PLLMUL12 | (RCC->CFGR & ~RCC_CFGR_PLLMUL_Msk);
RCC->CR |= RCC_CR_PLLON;
while(!(RCC->CR & RCC_CR_PLLRDY)); //!!! reload happens after this
RCC->CFGR = RCC_CFGR_SW_PLL | (RCC->CFGR & ~RCC_CFGR_SW_Msk);
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVl-P2roT_TTmZQRKHAjhgQc2lLYSbVdsf6r6hJxkSNx1Yn62A2Uf-tmvxgE2sL1_pPtwpcgkxjNzzpmxPcJaWTaIczZ5YJPlQLSu0mb-o3kOFA4yXZzmlXN7y6IF4yvGV6UuMq3cSJuS8dUL4yuRTbLq62TyyIIlCxbd-NGBRawtuEo4EDuHBgQorfeg1KEGaWGnTYnOyabsFkkHeEADSosCCzBYSuvQWDhKV4HVNYIoCoPWoh11UR7bzl4UhXRSN0JBrgsE2YCrsAuX6UKiBcYTHJUjkE1usMbGwUEr4aRCKJXOhGJ85iGD09BoB3klmhJBNCdXyaY8R1yTS2wcGiwg180lrjrdGDsjyxINuEpakNa2OOqr041G2vwQcRYtwGDRNoVoHLA4UK1kcWC9GqdjhQb7VsLUh6kgIxYHO61DxhPGZywOoBIWoquvAvb50CBJ0lgnGuclJytBi89akjATcNp1CjCe0grYac1fHZOzLlrUmzQIO9ncgKulLxWC3sBRG-s1EA14rhSraJFEekGjQe92Fp1PuGV8ZZ02aEE36kQZ7AJyxlevQWm80yIR54CmSxSVlrBUTbbSrSogu0H4M4mH8ZhMpAODPnNKPqMlVHYvaggDxldhCNnJUSVZZ9qcktxPCDERDoZfrNdm-OUF9A5y3RqLdxi78X2a-vS8FgSBPKJStLNuyoGnIEx9fenAelHeJJx20V0GupESbXCHBpscwSMmWSCTDmpt0DPv9orfe_hzj0bS4qKDyHhi8P-tpIRYV0d8F0CFokBjKfYFM6Wke_znQcsCZCPdNlc6f7ZnpN3S6cMF4Wy1Xjx9GLLo3SLdAIuW4Ce2i3Szfdysvj68AzZNCcPr_Hrx9d3n9Pv2k30GxmP6M8iCIAQWpSxK4e3KR-2hEtoH6A4vCI_2CuL6InceZ7JJU8KUrt5vfIhNmm7pY_v07cnvjWhJWPvT28f1upfvWZ8kC2Z3Hsn6V8-cyPTA2aN0eUV1-OHp44Xgjfdgdqykwn8Il4dv4H54-tgJ0kO8fKvIxfUd6g3R_fK5b_4bPD003mCz_H6fB4LmHzBIux8qsd9jY88XBVXgn4PyfPvEHtfrT_9bh_xSNPfC_Lpb6WW_U-E3zKfpNcpfEg__S-5P3yjM3zM_F9st639ZTOfavzq8VtLlUBgU86iYRTMxwHk4DcIwmsySYFDNsyyfJDwYF6GIi5jPpkkUBFxEUZTzLJ7iQM55wKMw5EkQjmMejPIxH09jzpMIi2mcJGwcYC2kGlE3Qc3IwB-q82k0mc0GSmSorO9pOG_w2J24jHNqccycbIZZW1o2DpS0zr56cdIp3wzV0lq6TfTescmyd0H724pO-4MwUmSq15Xc9jmD1qj75km6qs1Gua4ZX1HM889wb_QPzB3jK4-UbkPP5I8AAAD__x-MyHI">