<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/234423>234423</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Miscompilation where shrinking a double copysign to float can give a NaN the wrong sign
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          sairam2661
      </td>
    </tr>
</table>

<pre>
    **Fuzzer Generated Test**
**Reproducer**
https://alive2.llvm.org/ce/z/unaVE_

**Test Commit**
[e633c7da8ff144a11b3d875956fbaea06b969070](https://github.com/llvm/llvm-project/commit/e633c7da8ff144a11b3d875956fbaea06b969070)

**Description**
`optimizeDoubleFP` shrinks `copysign(fpext %x, fpext %y)` to `fpext(copysign(%x, %y))`, but `fpext` of a NaN may change the sign: for a NaN `%x` and `%y = +0.0`, the target may return a negative NaN.

**Steps to reproduce**
- Minimized test case (src), `input.ll`

```llvm
define double @f(float nofpclass(inf zero sub norm) %x, float %y) {
  %x.ext = fpext float %x to double
  %y.ext = fpext float %y to double
  %r = call double @copysign(double %x.ext, double %y.ext)
  ret double %r
}

declare double @copysign(double, double)
```

- InstCombine output (tgt), `output.ll`

```llvm
define double @f(float nofpclass(inf zero sub norm) %x, float %y) {
  %copysignf = call float @llvm.copysign.f32(float %x, float %y)
  %r = fpext float %copysignf to double
  ret double %r
}

declare double @copysign(double, double)

declare float @copysignf(float, float) #0

declare float @llvm.copysign.f32(float, float)

attributes #0 = { nocallback nofree nounwind willreturn memory(none) }
```

**Output**

```
declare double @copysign(double, double)

define double @f(float nofpclass(1020) %x, float %y) {
#0:
  %x.ext = fpext float nofpclass(1020) %x to double
  %y.ext = fpext float %y to double
  %r = copysign double %x.ext, %y.ext
  ret double %r
}
=>
define double @f(float nofpclass(1020) %x, float %y) {
#0:
 %copysignf = copysign float nofpclass(1020) %x, %y
  %r = fpext float %copysignf to double
  ret double %r
}
Transformation doesn't verify!

ERROR: Value mismatch

Example:
float nofpclass(1020) %x = #x7f800082 (SNaN)
float %y = #x00000000 (+0.0)

Source:
double %x.ext = #xfff8000000000000 (QNaN)
double %y.ext = #x0000000000000000 (+0.0)
double %r = #x7ff8000000000000 (QNaN)

Target:
float %copysignf = #x7f800082 (SNaN)
double %r = #xfff8001040000000 (QNaN)
Source value: #x7ff8000000000000 (QNaN)
Target value: #xfff8001040000000 (QNaN)

Summary:
  0 correct transformations
  1 incorrect transformations
  0 failed-to-prove transformations
  0 Alive2 errors
```

**CC**: @regehr
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEV01v4zgP_jXKhWggyx9xDjmkzeTFe5jObmcw14Vs0452bMmQ5LTpr19I_og7bdLZRRdbFGgtkXzIhxRFcWNEJRE3JL4l8W7BO3tQemO40LxhSRIsMlWcNoRtCdvuu-dn1PA_lKi5xQK-obH9FqHb_p8HbLUquhz1tHGwtjUk3BK2J2zPa3FEtqzrY7NUuiJsnyNh-2fC9p3k3z_94UyN1hwA3KmmETOc-BaTMMxXBU_LMogiHgRZWKSreB0nZcaR0yRbJ2u6oiTeEZa-xK-EPXTZMlcNYXvnxfDnptXqT8ytc2gA3P8yDlvPvd6hybVorVDy7HVCVWtFI55xp7qsxv1vJKFgDlrIHwZIQnPVnlwyCEvLFp8sEBY_EXYH09fJ4SQUrHLyfpmwdKY3aoyyXtwtZJ09qyQUVAkc7vk9NPwE-YHLCsEeELydcAul0oOANxA_OSUui-HzBCTcAWG3dEkHBKdtua7QepsabaclcJBYcSuO6Iwt5yR9tdgaF4oeK2bi6gY-C-mpKsC6Csi5QSAsNTr3Yd05P4RsO7usa-cAHSjuf31W6bbAUkiEwtMNJKKlo7ZW3IJUZZvX3BjCUiFLeEatwHQZSKUbwtZn7r34wCeQ1S2hW_C7S5-UcDekZxJ8cjH1mKPs6ZLs6bWs9nI5r-uZ47MUj4uDB87H89KpX1p7YxrtbEs7gla7nqkC85prvIZwNjwU90hub-EG_i-NvVNN5ihWnW1dhbHUVvacoX75P0vRGFN5pnSQjTz-chRYliGbcN80-zI7P2XxjPMymx-cgLPWFMWEPHo_Od4TFNILihfDnxvodbm1WmSdReMN9id_dQtSOUYznv9wqdKIIFUnH4Us4FHU9dAAGmyUPhGWSiWxz8_udTX1J_-LL5dzx3wp9k8p-6UCCyij79WUpzPcXm8Al4x-SFMY4oU3esB0-K8WXrgj4ad_jZXXR250-H3T3uhHHrJvmktTKt1wdw1DodBIwlYWjqhFeSIs6Avk08PDlwd35X3ndYfQCNNwmx-GzSfetDX28b2T4P5GDJ9WZUopTZnrhl_v-X1firPsjoJ0-AF_cfurdKzar6rT-QD7U7In9bL0QHRu5vcJ76c74RXoJfAZlbOIriE5rv29P2fpVSlcZuYtxD62gEZvIvbswNElzGXufR97B19qXMdwMF3TcH0ajzyFXGmNuQX7orSM3w1AyGv7FEouaixurHKD5hEvSG39dAyotdLmUqO8uxuapAslohorPOhFsQmLdbjmC9wEqzVLWLiKo8VhE6cFz2LG0wh5muVpgWleFnGWYBxlwSpYiA2jLAkoC1hIWRgteR7GmGThquRu0o1IRLHhop6G9oUwpsMNC6OIhYuaZ1gb_4JgTOIj-F3CmHtQ6I0frrOuMu7eEcaasxkrbO2fHrNhgsQ7-CxMrppW1P3hfTygxmFUFrICPp74qcFYNXSKnEuo3LjZT69uKn3USlZ-sl10ut787deAj8YQth_CPW7YXwEAAP__3v3u4A">