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