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