<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59245>59245</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
llvm.canonicalize() folding incorrect for denormals
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:instcombine
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nunoplopes
</td>
</tr>
</table>
<pre>
File Transforms/InstSimplify/canonicalize.ll has the following test:
```llvm
define float @canonicalize_neg_denorm_positive_zero_output_preserve_sign_input() "denormal-fp-math"="positive-zero,preserve-sign" {
; CHECK-LABEL: @canonicalize_neg_denorm_positive_zero_output_preserve_sign_input(
; CHECK-NEXT: ret float 0.000000e+00
;
%ret = call float @llvm.canonicalize.f32(float bitcast (i32 -2139095041 to float))
ret float %ret
}
```
The expected result is wrong. This function should return -0.0.
If you run the equivalent multiplication by 1.0, you get -0.0:
```llvm
define float @src() "denormal-fp-math"="positive-zero,preserve-sign" {
%ret = fmul float bitcast (i32 -2139095041 to float), 1.0
ret float %ret
}
define float @tgt() "denormal-fp-math"="positive-zero,preserve-sign" {
ret float 0.0
}
Transformation doesn't verify!
ERROR: Value mismatch
Example:
Source:
float %ret = #x80000000 (-0.0)
Target:
Source value: #x80000000 (-0.0)
Target value: #x00000000 (+0.0)
```
In summary, canonicalize should use just the input denormal flag and ignore the output one.
cc @arsenm
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVdtupDgQ_Rp4sUBgoC8PPKRz0UY72pUy0WjfWgYK8MjYrC896fn6LZvudCcbrXakIMtgu3zqdqpoVHesH7gA8qyZNL3Sk4now6M09iufZsH7Iy5bJpXkLRP8J6RCkJEZYkcgvRJC_eByIBaMjYqbKLuLsptolS1DiMO0bHXQc4kXhGKWRGV2jbiXMOw7kKh7PyvDLT_A_idotVfOzs7uZw0GNG4aPsg9l7gX0U1EtySidLnIRNLPycTsiFtRcYfzGSrxUBG9PaMkHgXPSbTenewtduT2t_vb35MvN7v7L-jHZ5n4Dv6P-7-ePTo-GuwpGlmahQciusuy1yvLB0EXKy-LPhG0RVxC6IObvslMX1BUugg03LbMoCDd8IKShObFNttWWZkTqxYQDKAfJz0XgxaNJ0PWd-9yelqG-Rk5AC8ztBY6BDBOWMIN-aGVHFLyPOJ372RruZLEjMoJL2WdliRBr9MF5LEnR-WIdjJwCv52_MAESEsmxOPIwZYFhOZI8jTDTAb5Ae31KL_COqPbTyXOm-z0aC75teDfBof-ZwI-9MgOn1sK74j5oQ2vnWJJS6fAIMjakgPo0C_ya-n7p6c_nzzpvzHhgEzc4L12fCPywrDVwCWTYf6qnG4vm9ehCfGOaPGyWUon85EOZDjz-WQp00iTV4gFkRy8IaHI_wthuftWOLsS9tV6rfCj-nhE2rtpYvroc31dq-dycAbId4dU8dQPbYOcs4hZYANhsiOYJKUhiCzthigJ6bWitvVkYNqAnGKo89Vqu87LbFXGXV1022LLYsutgPpfTePEHuzkne_jXLZKayxo3NGvppjYaVGP1s7GB5M-4Bi4HV2TtmrCRSi55ZXMWn1HAFxyYxz430m1pWUVj3WxgQbWFNrtpmVNVW6qvKzKdb7qN1XZsCYWrAFh6qjaISuRKog-cxF45smMQcRXUFbccPxH4XmD9eDPqruY1zSjNM8pFhtdl0VKm03TN021QZXtiq4xRjAxLtIQBqWHWIeIJI0bjG-p3FhzOWTG1wdAsAfxmbOj0rV0Us1CzWDi4GEd3PsHBIg9pQ">