<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/57357>57357</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[InstCombine] Wrong signed zero optimization
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zhroma
</td>
</tr>
</table>
<pre>
The following C snippet (see also https://godbolt.org/z/E41zbrThP)
```c
double f(double x) {
return x < 0.0 ? -0.0 : x;
}
int main(void) {
printf("%g\n", 1.0/f(0.0));
}
```
prints `-inf` when compiled with `-O1` or `-O2`. Right answer is positive `inf`.
Clang versions since 8.0.0 and newer are affected, 7.1.0 works fine.
The problem is inside `InstCombine` which transforms
```llvm
define dso_local double @f(double %0) local_unnamed_addr #0 {
%2 = fcmp olt double %0, 0.000000e+00
%3 = select i1 %2, double -0.000000e+00, double %0
ret double %3
}
```
into
```llvm
define dso_local double @f(double %0) local_unnamed_addr #0 {
%2 = fcmp ole double %0, 0.000000e+00
%3 = select i1 %2, double -0.000000e+00, double %0
ret double %3
}
```
This is incorrect https://alive2.llvm.org/ce/z/jFq6m7
```
Transformation doesn't verify!
ERROR: Value mismatch
Example:
double %0 = #x0000000000000000 (+0.0)
Source:
i1 %2 = #x0 (0)
double %3 = #x0000000000000000 (+0.0)
Target:
i1 %2 = #x1 (1)
double %3 = #x8000000000000000 (-0.0)
Source value: #x0000000000000000 (+0.0)
Target value: #x8000000000000000 (-0.0)
```
It would be correct only when `select` has `nsz` fast-math flag.
#49625 tells probably about the same bug, but example here is much simpler.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVU2TozYQ_TX40mVKCDD2gcOMvVO1p01NppLjlABhtCskIgl7xr8-LcGusTfZJKcsxYeE1K9br1tPlW7ey5eOQ6ul1GehjrAHq8QwcAcR3VrOgUmroXNusFH6ENEnvI-6qbR0sTZH7F3w-ZAll8q8dL9EdBeRQ0Qeog2Z7nrqN3qsJDpC1Ln5hnMhKh6nccDLcDcaBW8QpXsgMcHvE6ynxgPOT-e5UXGYGkI56JlQCHrSovkOcDA4w7uMKI1ofozyvQrNPSQxwbj9GPGtnb-_w_-2iKkb4Cxgfy1Uix84d1xBrftBSN7AWbgujH5K_KA2U4fiO4ZncewcMGXP3ICwMGgrnDhxP2dCi2en4b2XDLNx4sYKrSxYoWoO29iTwVQDinsYZjA_bctrxxu_qCLGZcFZmy8WWqH4DaLP82A0Ut97_0JZ0QTvH5V1e91XaDCtSdQdOIOhttr0uN5bLqQ89XNOuXcCjdWvUtdMwpzZKCOLPCPxnmAIU15HpVjPm1fWNEgPTckyYziVYq4P0Nb9AFhicIMRiiJcPKKPhCzM0mBmuUQuQCQByRvM9us7w-tIQJ5xsP4Wv9MfFwOWgv7_mOE_MTMvnS8vX2G1Nsa7vZUPJrHsaezZmiWk5rOOfH76Y9MXy6q9x_5alszhvsCYuMUdXTi_U0T7HtFkafzh-fnTs9eO35gcOfTCol3d3Ux5Y_0guQ9uqVN-8YE4TMQbubsgKMrjLBwLsF_1aOor1sz2FccbXm0WhP53Vy_MHLn7W1e-u01-6Gr7F67WS0fTauDkufMk_sv4pshuzf7R112ap_dHh1o2ygYqDl9LSSv5PskuTp6q2otWx4IuK3vxvZZZt8ZUd9BKdrxRQYwm221oDo5LaYMgsgohWaVHBw410uIuhGo8-q1Q4T8-VQh0HNUWy7ofUR6t8P_MDL3iZbLZJBlNtiRbNWXa7NIdWznhJC-j_HGpsPkBfjcatd2Ko8JD48KNBj040YtLKOrVaGR5d-DiwTJWMR402AkqM33WGP5nzwB9EtaO3GIjL9K8WHVlteU5yTdFsm03nDYJLRqSbLI2q0ixbXmzkqzi0vrw8EjE8wQChD8e88NKlJRQSrY0TwhJkyze0YzUBWUVgiR10aKScTx65bdtvDJlCAmZszgohXX2OshsWG5gw-Oz0XXalJfO6J6tgucyRP4n5k9ipQ">