<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/113989>113989</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Wrong folding to `fabs` (`NaN` not handled)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
bongjunj
</td>
</tr>
</table>
<pre>
https://github.com/llvm/llvm-project/blob/1ceccbb0dd9d8539fec2213566fe6cc2a05b7993/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp#L2814-L2885
Alive2 report: https://alive2.llvm.org/ce/z/y2UAwe
```llvm
----------------------------------------
define double @select_fcmp_ole_zero.2(double %x) {
#0:
%lezero = fcmp ole double %x, 0.000000
%negx = fsub double 0.000000, %x
%fabs = select i1 %lezero, double %negx, double %x
ret double %fabs
}
=>
define double @select_fcmp_ole_zero.2(double %x) {
#0:
%fabs = fabs double %x
ret double %fabs
}
Transformation doesn't verify!
ERROR: Value mismatch
Example:
double %x = #xfff0000000000008 (SNaN)
Source:
i1 %lezero = #x0 (0)
double %negx = #x7ff0000000000008 (SNaN)
double %fabs = #xfff0000000000008 (SNaN)
Target:
double %fabs = #x7ff0000000000008 (SNaN)
Source value: #xfff0000000000008 (SNaN)
Target value: #x7ff0000000000008 (SNaN)
----------------------------------------
define double @select_fcmp_nnan_ole_zero.2(double %x) {
#0:
%lezero = fcmp ole double %x, 0.000000
%negx = fsub nnan double 0.000000, %x
%fabs = select i1 %lezero, double %negx, double %x
ret double %fabs
}
=>
define double @select_fcmp_nnan_ole_zero.2(double %x) {
#0:
%fabs = fabs double %x
ret double %fabs
}
Transformation doesn't verify!
ERROR: Value mismatch
Example:
double %x = #xfff0000000004000 (SNaN)
Source:
i1 %lezero = #x0 (0)
double %negx = poison
double %fabs = #xfff0000000004000 (SNaN)
Target:
double %fabs = #x7ff0000000004000 (SNaN)
Source value: #xfff0000000004000 (SNaN)
Target value: #x7ff0000000004000 (SNaN)
----------------------------------------
define half @select_fcmp_nnan_ugt_negzero.2(half %x) {
#0:
%#1 = fcmp ugt half %x, 0x8000
%negx = fsub nnan half 0x0000, %x
%#2 = fadd half %negx, 0x0000
%fabs = select i1 %#1, half %x, half %#2
ret half %fabs
}
=>
define half @select_fcmp_nnan_ugt_negzero.2(half %x) {
#0:
%fabs = fabs half %x
ret half %fabs
}
Transformation doesn't verify!
ERROR: Value mismatch
Example:
half %x = #xfc04 (SNaN)
Source:
i1 %#1 = #x1 (1)
half %negx = poison
half %#2 = poison
half %fabs = #xfc04 (SNaN)
Target:
half %fabs = #x7c04 (SNaN)
Source value: #xfc04 (SNaN)
Target value: #x7c04 (SNaN)
Summary:
0 correct transformations
3 incorrect transformations
0 failed-to-prove transformations
0 Alive2 errors
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcV11v4ygU_TXkBTXCl_jrwQ-dZiKtNJqV2tndxwowdlxhiABn0vn1K5zEsWfTJt2ZarVjVW4M59x7gHuQLnOuqbWUBYo_oHg5Y51fG1two-unTj_NuCmfi7X3G4foLYIVglXd-HXH58K0CFZKbY__bjbWPEnhEay4MhzBKhJSCM5JWeZlFtO8kgIgonGSVDIRAhiJeZrndBSnCbwvlmlXGds6BKvftPN3puWNltOvB6mk8HOx2SCgnyCLFjefIMtiRJaI3O7ft6rZSsBWboz1iN7i6VJYPz0PyefG1ghWIiT5hmD1DH_cfpXjWId3QvZ_veJ-6ObKZ48uZdVoiUvTcSUxWhDXr-OxEu3m0Sj5-E1aMwcE2REC8Q5BjlH64SABKAlL6D9wmFcykDCiSxzCYKNOCXr2HSZz0j8jlpb1bs9xHT_iBxzc7bknfMW46_F7xbiJTrkD_JQxRJ6ODHGs9KPhEPKwqHR5-EGXiH58v70aVtH_-DcKh_JkvjEal0Y6jSD1eCttUz0jiMYF8_H-_vf7UHp_MtVJ3DauZV6sJ5AdazdKDjpHonqlCOiuqioyejKMIHv4zD4jyMehHkxnxSnS-IiGUCRwyUCcHtuASi8lnO7RW4V-YbaW_sySJ8EuitivF2_D3oZNvkrBPveUdDHT-P0THa810_-l7UP-_5_3f2TXfoELYEEIedcLYGMaZ_TVPn9Fz9t9fjbYJZ-fJV3y-Suyf8Dna6aqs_Xa1f5Ry3oo2T3wcsEioNHJ5F3t8Yh5h8kuu2jwnkB2L5gbAYWDI8pyCH408oF26S4IKgN8ou34ETKM7XUcv-4O-Ok7Or0CTqzrFL67_QdBJ7MJsniL4YeSCeQwkkUDbXy-_zD7-MBenJzeAy9L-877Z-npOfpZt58DnnX4K3vVtS2zz6NiIFgYa0MV-8mpuiOA4kZfgBBcsUbJ8sab0ANt5cvAQz8irTXWfddQzMqCljnN2UwWUUpJlCxITGbrIs1KEXORL0qSlIIkhFcpExQ4ywRNgM-aAggsIgI5iUhKyZxlIuM0lhmDlOQ8QwsiW9aoodOZNc51sogimmf5TDEuletbQAAtv-J-FgGEjtAWfXPHu9qhBVGN8-4UxjdeyeIva3SNK6PKRtfYG4wS0vsm6a9XlJBwFAnB2gRj6VLJEkE-66x6e2_ZawuN4UH8toC_AwAA__8qphhw">