<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/89791>89791</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Loading/storing float/double on 32-bit x86 without SSE can cause the value to mutate
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
beetrees
</td>
</tr>
</table>
<pre>
In LLVM IR, it is valid to transform
```llvm
%x = load i32, ptr %0
store i32 %x, ptr %1
```
into
```llvm
%x = load float, ptr %0
store float %x, ptr %1
```
([alive2](https://alive2.llvm.org/ce/z/CexSsR))
However, the 32-bit x86 backend will (when SSE is disabled) miscompile the second example:
```asm
fld dword ptr [ecx]
fstp dword ptr [eax]
```
([comparison](https://alive2.llvm.org/ce/z/KXdENm))
This is a miscompilation as the `fld`/`fstp` instructions will convert bit patterns that are signalling NaNs to quiet NaNs (e.g. 0xff800001 -> 0xffc00001).
This can cause miscompilations like [this one](https://github.com/rust-lang/rust/issues/114479#issuecomment-2072052116), where the optimiser replaced an integer load/store with a float load/store, ultimately resulting in a segfault.
Related to #44218.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUlF-P2zYMwD-N8kIkkGknth_80PtjrNjtHu6GYa-yxThaZcmT6CTdpx9k33bXXtehgZCIIkORP5FUMZrBETVifyP2dxs188mHpiPiQBQ3ndefm48OHh5--wU-Pgm8BcNgIpyVNRrYAwfl4tGHUcg7IT-Ig1yXted_jnB_BZHfgfVKg8kxeZk4gMC9XE0i-0BJlc6ub_TZV15fxOXbOPZv5f-9-mi94v-6fFH-yPUCK7G_UdacCcX-TmB1Yp6iyD8IbAW2q2aXgtn5MAhsexLY_iWwvaXrc3wSWKf1xuVP_kJnCikAPhHkuO0Mw7U6QKf6T-Q0XIy1ILC6nMjB8_N9egptouosaYE1jCb2fpyMpcVDpN47DXRV42QphfYtXiq-4DpaDemjLz7olcH-hvprSm81iDy9N1CvBt8hleJSwUTvfpDWz7_r-8fxPa1fTyam_NVr1oqNd6Dikrw4yKPVKRZs0z7yJA4SjIsc5j5ZxpVn792ZAkOCPSlmCi55UAwqEKQGUdYaN8Cjeoyp5v-cDfEqCaxoN-xAXo_HSkopM9iK_H6R-0UWWO_ehd0rB72aI30VewRrPlGiysnMO_oWrMHwae52vR8FtmGOvLXKDS97ga2JcaYosM2yoihrgfly0vtxJMdblCXKPWbZYYF6C5cThbVg_MRmNJECBJqs6kmDcmAc00Bh6SKB7dowF8MnUC9981aTPM6WzaiY7GcIFJPkBjAOFEQajmq2_AWTJ7KKaZknAvOiwKzabXST6zqv1YaarMzyqqrrLN-cml6XfVYqXR6qkkjLrC6wk0dNnawrLLuNaVBiIQvMs0OeFcVuj6rEQ0FFV9UH7HJRSBqVsf-W22bh01R1WWcbqzqycZmIiI4usCgFpi7fhCb9Z9vNQxSFtCZyfPXChi01D15pszxHwpESfxk8rfZzZwm8e9vaiaOfeenm17JIj3FWdqbEZJxZMW3mYJvvFMIy9taf7RT8H9R_UQtLcn8HAAD__xprzig">