<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">