<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74326>74326</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
InstCombine: fold of shuffle into fadd changes NaN payload
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:instcombine,
floating-point
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nunoplopes
</td>
</tr>
</table>
<pre>
This optimization changes the NaN payload. Originally it was a pass-through for the last 2 elements, while the optimized code can produce more NaN payloads.
```llvm
; llvm/test/Transforms/InstCombine/shuffle_select-inseltpoison.ll
define <4 x float> @fadd(<4 x float> %v) {
%b = fadd <4 x float> %v, { 41.000000, 42.000000, 43.000000, 44.000000 }
%s = shufflevector <4 x float> %b, <4 x float> %v, 0, 1, 6, 7
ret <4 x float> %s
}
=>
define <4 x float> @fadd(<4 x float> %v) {
%s = fadd <4 x float> %v, { 41.000000, 42.000000, -0.000000, -0.000000 }
ret <4 x float> %s
}
Transformation doesn't verify!
ERROR: Value mismatch
Example:
<4 x float> %v = < #xff800400 (SNaN), #x00000000 (+0.0), #x7f804000 (SNaN), #x00000000 (+0.0) >
Source:
<4 x float> %b = < #x7f800400 (SNaN), #x42280000 (42), #x7f804000 (SNaN), #x42300000 (44) >
<4 x float> %s = < #x7f800400 (SNaN), #x42280000 (42), #x7f804000 (SNaN), #x00000000 (+0.0) >
Target:
<4 x float> %s = < #xff800400 (SNaN), #x42280000 (42), #xff804000 (SNaN), #x00000000 (+0.0) >
Source value: < #x7f800400 (SNaN), #x42280000 (42), #x7f804000 (SNaN), #x00000000 (+0.0) >
Target value: < #xff800400 (SNaN), #x42280000 (42), #xff804000 (SNaN), #x00000000 (+0.0) >
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVl1v6jgQ_TXOywhkxg6Bhzy0UKR96ZV6q31dOckk8cqxo9jhtvvrVw7QTVVaof26KLI0NuNz5syQg_JeN5YoZ-k9S_eJGkPrhtyO1vXG9eSTwlWv-XOrPbg-6E7_oYJ2FspW2YY8hJbgUT1Cr16NU9USvg260VYZ8wo6wA_lQUGvvF-EdnBj00LthinLKB8AgQx1ZINnuIMfrTY0HZ6xqILSVQSlstAPrhpLgs4N7yD9kvE943fndc1PjzHH7rwl7mGK8BDIB4aH50FZX7uh8wwPv1gfdq4rtCWGB9-OdW3oN0-GyrDQ1pMJvdPe2aUxc6SKam0JmNhJeIHaOBWYeAAmea2qiuHmwwmmR4ZbYNn96QaIWwUwsYeY8vGqKWEXE0Culnz6xA2J80DMA3kOgGX7GYqfUM7FHakMbrgGV0xwn9CYAFZxWcclu1w_ULiW489iXXgwsWfi4V_Vzv9T7Rb8WjDX7sbi3ibq9OuoHHnLMAtwpEHXrwxX89F5eHr69sTEHfyqzEjQad-pULbvvvKiut4QE5e5vlLfVD0TO2AoXup6w7mM5HHz_VE9MtxO9aN44fxSF24Y3vMlnx1m9Sam3ZwHb008rd_dOJRf8ize8cw-5ykRNxc8ibdxlCjeOEr5nt-Vtv2XVG6S61kNDYWv5PK3tvVTjvXf5nhqJhzjWMb5_DlKnTT6yOL_1eLNSZIqF9VWbFVC-Srj8RHrNGlzkWFdq-1WlXWWbtZZRqWiMuXpdq1wU8hE58hRrJDLlZRbTJclpoJkkRVqw1WpFJOcOqXNMvrT0g1Nor0fKc-kwHViVEHGT9aM2Glfuq7XZnrDMESGO4Y4GZu409aH8mJi56NpqLRtFr3TNsTtdJ8MecxYFGPjmeRG--D_Ag86GMrnhijuoHamAldfzAO0De70zr38B5iZcTIOJm9D6H0ccTwwPDQ6tGOxLF004LMPTxz6wf1OZfTjqejoxVPdfwYAAP__AdlHFw">