<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59279>59279</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
InstCombine: incorrect fabs formation
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:instcombine
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nunoplopes
</td>
</tr>
</table>
<pre>
Test `Transforms/InstCombine/fabs.ll` shows the following transformation:
```llvm
define double @select_fcmp_ole_zero(double %x) {
%lezero = fcmp ole double %x, 0.000000
%negx = fsub double 0.000000, %x, exceptions=ignore
%fabs = select i1 %lezero, double %negx, double %x
ret double %fabs
}
=>
define double @select_fcmp_ole_zero(double %x) {
%1 = fabs double %x, exceptions=ignore
ret double %1
}
```
This is not correct as `fabs` produces a non-deterministic NaN payload, while the original function preserved the NaN payload when x > 0.
cc @arsenm @jcranmer-intel @jyknight @rotateright
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytU8Fy4yAM_Rp8YZqxcZzEBx_Spp3ZS0-9ZzDINl0MHsBtul-_Asdt2sOeNsPESOg9noTUWvnRvIAPlOzyF8eN76wbPWFPv4wPD3ZslQG0Ot76jdYYRP1g3z0NA9DOam3flelpWJE8KGtIeST5ieRHDF-W1m_j4pLQISOVdm41ULLNPWgQ4dyJcTpbDec_4CxhhzWAVRfCakr29wueRpeGGEVJeaIRRxFHvwEeaL7J0-8GZaC_LBg_t2v8ZxxiVixcBEwxEY_RqjfWwQ1NLEWiWZRTVXxJiugvIfHC757LyuMg3Lgj5bVi-9N1U55I-fgfa1YsqUfxP0r1j3S_yyx-alyf92qm_5dBeYrL2ECFdS6WiPvYXilLbKDJWTkL8JRjkLmTEMCNyigflKDP_JlO_ENbLqO290Hh3bHZrFO9MlzTbjYiqkUe8ODeQKbzGyCiwND41o_4vrfihIjl486DGePuVWDjjuDulAmgk-fjt1H9EOLe2cBRWzQzaIrdrj4cqm1VZbIpZV3WPAsqaGhuR6U8UmXWvFO1P8cim51uhhAmHweEPeHqVRjmdiPsiEYakuVzhzV6RQY0lfczxIGsaravs6FhZc1KxneCsVoWW1ZyBhx9smvFtoZ9pnkL2jekuieMjcoj-6T0MpmMLY3O0mXlUaF0sU45I9UpUw3LGStYXuR1vi2qjSxA8oOodrwo66IWWBgYudKbSLGxrs9ckzS3c-_xUOND-q9D7j32FEDSg_x8DoN1jZmNnbSdwGcpwyal9xfCHmy1">