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