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