<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/93414>93414</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
SDAG doesn't handle signed zero correctly when folding select -> {min|max}num
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:codegen,
miscompilation,
floating-point,
llvm:SelectionDAG
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dtcxzyw
</td>
</tr>
</table>
<pre>
Reproducer: https://godbolt.org/z/sqYqK8vd9
```
; llc -mtriple=riscv64 -mattr=+f test.ll -o -
define float @test(float %1) {
entry:
%2 = fcmp olt float %1, 0.000000
%3 = select i1 %2, float %1, float 0.000000
ret float %3
}
```
```
test: # @test
fmv.w.x fa5, zero
fmin.s fa0, fa0, fa5
ret
```
When `%1` is -0.0, the former returns +0.0 while the latter returns -0.0.
`SelectionDAGBuilder::visitSelect` incorrectly refined the select (always returns +0.0 when the input is -0.0) into `ISD::FMINNUM` (returns either 0.0 or -0.0).
Related code:
https://github.com/llvm/llvm-project/blob/a4a436672a2c179274e07aeb68e9acd6f483a653/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp#L3718-L3754
cc @topperc @arsenm
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVEuP4ygQ_jXkgmJh8PPgQ9Jet0Y7M4dprVZ7JFBOWGHwAE4_fv0K4qTTvXMZK4IUfPX4iqri3qujAehQuUdlv-FLOFnXySBe3l6fNwcrX7sfMDsrFwEOsR0-hTB7xHaIDogORysPVofMuiOiwxuig__5z88_m7NsEekR2a1rRdbfRWR7rLXA2yk4NWtArHfKi3NV4O3EQ3CI9YjuRxzAh0xrvLV4e1GVMCoDeNSWB4wKEhGINqtMyxzRFqN6f0GDCe41BpskHAEUI9bjUUwztjrge8UHTDKSvjs8S3gPGkTAKk8mIvSj4kX6rO7gzgFbudf9r3PyUUy82A4jym40V6uXb5zO2XP2gkdexgDewNnPAGUyj_HISYrwupUfYQ7Cr-NJ698nMDieRZ4VwcrjLcmSpXACPFo3gYs2Fmc8RnRPMoKfT0pDutc8hLv7qJrdvD2lnCpr-t3jflFapgJDbHdWXoXLbfJphHUORNCv2KXnl8n4-iaINlw_81f__zDAJKAy8xLeQ2-xMsFGVl-e-ovH4duX79__-ha9Idpc7YAKJ3DxVbF1V-U1_h-geQCJhZVwK7BPvaHCaTlkwk6IDlqfr9t2dvbfyI0OB20PiA684AWrqppyKvK6pXUBpOZwqBpouZDVWDSMVyW7s6Oi3oOV8AgG0eE-l5_ENbWZmGdE2VdW5832K6vLYq2DyyZEKjM7z-DSX-48mAlvZMdky1q-gS6v86pmZVGzzamTrThQSRtgLeRVU1ZUlEUr8rJkOakaulEdJbQgJa3yoqxLluUSinIUMpdlwQQRqCAwcaWzyClOkI3yfoGuZUVebDQ_gPZpLlGaWLNdTPYx8o0diCidlBd2mpXmkevtOLWcMsftbJUJt-PVyMdU0Tj1XJfe5bAcPSqIVj7496CCChq6p373iKUFbxCtAz5xIzXgNDxlaj78XqSp8EarpTLHa5VuEfsjzqVJGVQ_TPwF1b1Zps3idPfbZZPy5BEdLqk6d_S_AAAA___BObMt">