<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/191338>191338</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Incorrect select elimination cut the poison propagation on vector splat return
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Xinlong-Wu
      </td>
    </tr>
</table>

<pre>
    For the case:
```llvm
declare nofpclass(inf zero sub norm) half @returns_nan_f16()

define nofpclass(nan) <4 x half> @ret_nonan_splat(i1 %cond, half %unknown) {
  %nan = call half @returns_nan_f16()
  %freeze.ins = freeze half %nan
  %nan.vec = insertelement <4 x half> poison, half %freeze.ins, i32 0
  %unknown.vec = insertelement <4 x half> poison, half %unknown, i32 poison
  %splat.nan = shufflevector <4 x half> %nan.vec, <4 x half> poison, <4 x i32> zeroinitializer
  %splat.unknown = shufflevector <4 x half> %unknown.vec, <4 x half> poison, <4 x i32> zeroinitializer
  %select = select i1 %cond, <4 x half> %splat.nan, <4 x half> %splat.unknown
  ret <4 x half> %select
}
```

It may return `poison` if `%cond == true`

but the `Opt -passes=instcombine` will optimize it to: 

```llvm
declare nofpclass(inf zero sub norm) half @returns_nan_f16()

define nofpclass(nan) <4 x half> @ret_nonan_splat(i1 %cond, half %unknown) {
  %nan = call half @returns_nan_f16()
  %freeze.ins = freeze half %nan
  %nan.vec = insertelement <4 x half> poison, half %freeze.ins, i64 0
  %splat.nan = shufflevector <4 x half> %nan.vec, <4 x half> poison, <4 x i32> zeroinitializer
  ret <4 x half> %splat.nan
}
```

There is only `noundef` value that can be returned

Alive2: https://alive2.llvm.org/ce/z/kKjvL4


</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsVU1v6zYQ_DXUZRGDomTZOujgF1dA0AK9FGhvAUWtLL5HLQWSchr_-oKSoiQN0hZF0V4KGLD4sTO7yxlSeq8vhFix_Re2PydyCr111S-ajKXL3c9T0tj2uaqtg9AjKOmRZSfGT6zgy8-Y68D4qUVlpEMg243KSO-ZOGrq4IbOgp8aIOsGJkropemA5dxhmBz5R5L02KUFE0cmyggcsTpN76FIUgxm2X0Ov84YLPtuhXkkG0H8aGSIrCkwsVeWWibuVzqxn-gb2acF5PCF8RPEWZIELDuDksb8aWZzROcQb7jT5OfAZbixxDRfoXdXVPMuTR5dQIMDUvh9EaPV3tLbXF854qzOBPAX1LWMv4u8dWGBXTes2HMDdy8t8f3UdQavqIJ1Hxq_1RehPqVdF3Qm4nyUgiYdtDT6hu497ZrZX6J-04R_gB4NqrDwLp_vBfSRfuvTHy2_dDqyOPxwNBtxVPzh_NZQiwceAgzyGRYtAiv4WlbBQXdxvKYYE4-5BzfhFtxMYbYrK_iPY4C7UXqPnmVnTT4oOzSa4mZ40saAHYMe9A1BBwiWZSdYQP53-L_m8CJ_dfh_4cJPBLrp_BON_tSjQ9AeLJnnKDayE7XYRWldpZkQQi8DKEnQ4CplbJfYk9FXFFFtfQijj4-KqJmo5Ty_i5rbWXdholbIRH1jov72_dfrD_kSnrRV1pZZKROs0sNhfyj3aXlM-mqvjtgqcejSTEqRyjbnWSoaeWhRYVmWia4EFwXPU85zUWTHXa542bVclEVxSPNOspzjILXZcki09xNWaZlm2TExskHj5_dSCMInmFeZEPH5dFUMumumi2c5N9oH_woTdDDzQ_tAPtyvLtyf4YGUdS7ePOsFhEYPmmTQlkCtVl6OE0ZnR3lZlizBqov5pNYGJ5Mz1fueXnTop2an7MBEPbt5-bsbnf0a7yBRz0V4Juq1ymslfgsAAP__FMKClw">