<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/118815>118815</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Potential bug on InstructionSimplify.cpp/foldSelectWithBinaryOp
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
glyh
</td>
</tr>
</table>
<pre>
I am pretty new to LLVM, so what I said maybe nonsense so please forgive me if I've done such mistakes.
https://github.com/llvm/llvm-project/blob/f1d81dbd0573502134270495aa43e3ffb3193ab0/llvm/lib/Analysis/InstructionSimplify.cpp#L100-L112
This is a simple instruction inline optimization that is **not referred anywhere in the codebase**.
But I don't see why it's the case one of X/Y need to be identical to one of TV/FV.
Isn't it the case `(TV == FV and B) ? TV : FV` always evaluating to `FV`; And `(TV != FV or B) ? TV : FV` always evaluating to `TV`, regardless of what B being?
Also, what if B contains side effects that assigns to either TV/FV?
```llvm
@x = global i32 3
@y = global i32 4
declare i32 @set_x(i32)
define void @main() {
entry:
%A_val = icmp ne i32 @x, @y
%set_x_val = call i32 @set_x(i32 10) ; Call set_x, which modifies x
%B_val = icmp ne i32 100, %set_x_val
%C_val = or i1 %A_val, %B_val
%D_val = select i1 %C_val, i32 @x, i32 @y
ret void
}
define i32 @set_x(i32 %val) {
store i32 %val, i32* @x
ret i32 %val
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVEGP4zYP_TXKhdhAluxxfPDBmYGBAebDV2AHaXtayBZts1WkwFIy4_76QnKSTYvtYYEAScTH98hHicp7Gi1izYo9K1426hwmN9ejWaZN5_RSv4I6wmnGEBaw-AHBwdvb4X9MPIN38DGpAK_gFWk4qqVDsM56tB5j9GRQeYTBzSNdEI4INMArE-UFQTuL4M_9BEfyQf2JfguMN4w3Uwgnz2TDRMtEO1KYzt22d0cmWmMut68vp9n9gX1gou2M65hoh0zvMt1pXpSy4CKTuSh5XhVK5RLlMHQyq6Tq-AMPxbzGKrN48ky0r9aH-dwHcvYrHU-GhmXbn05MyLeM8y9vWSbWGt8n8kAeFPiIQ6DvmUDWkEVwp0BH-kulsxCNIg9MNEw01gWYccB5Rg3KLh8TzpEDwoTQO42d8rhCt6vg_hx91s4yUQbwiPAxLUCBidKvWdHp6Kkb4Dcm2t_BIuo4rg6BNNpAvTLx_xX0fmCibQ9X_le_MlP4zsaeOBO79wMw-cLkC7QHUFbDnokKmGwhRRpoD-yJgzIfavGAF2XOKpAdoxR74inK5B4aqx8YRXZldPNPEr4nQvEMM45q1ga9j-2km7iHDsmOTLZrV43xLkJTkAbYQ-9sUGQ9eNIIOAzYB79OZ30KPsoghQnnm0V3uiicPun-8Ibl_DOaA6NxnTJAUoBcz5d_n-crhcbeqDhrKYDl3GP49snEjqRgorpBhnh9Lo50hBwVWSZ2yaNyz3iDNsxLfB-8AWCiaL5dlEly1B9PYO_kn7H1WMvKm8BJ8J7QK2N-UApkPMpBHNtzhFxj0UiKL9ZpGgg9fN5o9z-sIeNpUI-yD6U833PcDJTdW7mm7K_whH25Yz0a7MMV_3zDP3Z8_b2k3BlDcjLqli__MPgHfTNRJMKb1QA-uNu0rrEkwESz6t00HhB3pdttYbzZ6FrqSlZqg3VWSpnzqqz4ZqqHng95j0VV7nhRCqlkV_UZZn2HlSyfnjZUCy7yTPAiy3PJq-2uzyTvd5gpxXeFzlnO8ajIbOOl3Lp53JD3Z6yzbLfLio1RHRp_W-9znXZndx49y7khH_z3vEDBYP2LC3FZKAPdeQRn4T-XYjs4o7-mefxKYdqTVfPy_9PmPJv6p5d4Kjru4Gvdl1r8HQAA__847P6-">