<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/64859>64859</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Comparison of add of extended booleans not folded to xor
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:instcombine,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
arsenm
</td>
</tr>
</table>
<pre>
I was looking at [some code that tried to compute a sort of enum scheme by adding booleans, and comparing to constant values which failed to form nice boolean code](https://github.com/RadeonOpenCompute/ROCm-Device-Libs/blob/46939af92ad91238c878a82aad2220822073ffa1/ocml/src/powF_base.h#L64). This is really just an xor.
https://alive2.llvm.org/ce/z/RSnV-d
```
define i1 @src(i1 %arg, i1 %arg1) {
bb:
%i = zext i1 %arg to i32
%i2 = zext i1 %arg1 to i32
%i3 = add nuw nsw i32 %i2, %i
%i4 = icmp eq i32 %i3, 1
ret i1 %i4
}
define i1 @tgt(i1 %arg, i1 %arg1) {
bb:
%xor = xor i1 %arg, %arg1
ret i1 %xor
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVF2L6zYQ_TXyy5Bgj_z54IfdBEPhwoW29LXI0jjWrSylkrzJ7q8vcu5ms3TpQyFEI-ucmaMZzYgQ9MkS9ax6ZtUxE2ucne-FD2SXbHTqtf8FLiKAce4vbU8gIrDqObiFQDpFEGcRIXpNCqID6ZbzGgkEBOcjuAnIrgsEOdNCML6CUCp5GZ0zJGxgeABh1cYTPp1sTmyIwkZ4EWalAJdZyxkmoc0tyOT8AlZLenezKWHVkWE7x3gOjD8xHBgOJx3nddxLtzAcfhWKnP1-Jnu4qUzfvh-W3ZFetKTdNz0GhsNo3MhwKOuOd2LqUKiuQN7KtmlFi0IoRMxbxLzh0yQKhoOTi2E4BC8ZDmd3Gf4cRaD9zJB_q0uG3R5-n3UAHcCTMOYVfqwhgrBwdX7P8iPLn27_n9ULo18I98a8LHvnTwwHmTS_Jd2_2T926pHK6vznb9sqmrQl0AWwMt-UtcnGSiRHB7hvCoYdsOb5RhvHFH0zIQE0MH6EN7rGD0Yqgeb4iMIvYMUXOL7hhFJg1wvYcEmAm4ckKhmP8HKDa7mcgf6-Q3mCFu84T-8xdfkzE83xMTGfMhFP8X9m4ur8piatn_jv5H_puTr_paB7pTLVc5VeWUZ9UXdYF12Vl9ncl6ps8maUqmkqIYpWCZ53Vd3wYuI5yTrTPebI8xaLAvMq53vJ5VhXOXXdyDtRSlbmtAht7o8n0yGs1NdlW3WZESOZsLU8YkIw_qRtiNIto7bEMFWDIS46BFI7d4560W8iamfTWXXMfJ9ou3E9BVbmRocYPkJFHQ31h1tLB2fTGEg1T9PgGskqUvcBANZFmJxRt9a-Op-t3vT_0cab3tuyO3v3g2RkOGzXS-273fCfAAAA__905G_1">