<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58624>58624</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Weaken `xor` to `or` under `nand`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
scottmcm
</td>
</tr>
</table>
<pre>
Alive2 proof: <https://alive2.llvm.org/ce/z/tMGuKE>
```llvm
define i1 @src(i1 %x, i1 %y) denormal-fp-math=ieee,ieee {
%start:
%_4 = and i1 %x, %y
%_3 = xor i1 %_4, 1
assume i1 %_3 ; <-- because we know !(X & Y)
%0 = xor i1 %x, %y ; <-- this X^Y
ret i1 %0
}
=>
define i1 @tgt(i1 %x, i1 %y) denormal-fp-math=ieee,ieee {
%start:
%_4 = and i1 %x, %y
%_3 = xor i1 %_4, 1
assume i1 %_3
%0 = or i1 %x, %y ; <-- can be just X|Y
ret i1 %0
}
Transformation seems to be correct!
```
It's also possible that, for normalization, this shouldn't always happen, so here's my non-minimized example: <https://alive2.llvm.org/ce/z/_c36CA>
In that one, replacing the `xor` with an `or` opened up a bunch of additional possibilities that ended up making a huge improvement in the generated assembly:
```diff
test edi, edi
je .LBB0_3
test esi, esi
je .LBB0_3
cmp edi, esi
sete al
ret
.LBB0_3: # %other
- test esi, esi
- setne cl
- test edi, edi
- setne al
- xor al, cl
- xor al, 1
+ or edi, esi
+ sete al
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVVUuTmzgQ_jXiorILhMH4wGFsT1Kp3b1t1SanKQGN0YweFBLj8fz6bQnssZ1KsjkuhZHU7_66W65McyofpHgFRvvBmJakD5Sku8653uKesE_48iCwlPJVLc1wQEoN-HnHn_vr8_jHI0kfSbwn8QPJ4-n1shOpgVZooCKhZBXboSas8HuWvRG2o9P2RNiGNqDNoLhctP1CcdeRdC8A0NHOL5Sst7MPllnHB-fDCwTqTTytMO495bqhV-aD7SuhNAi9mWEWelp5qeQswq0dFZx5Xnjr0VgsaAU1Hy3QI9AXbY7ITzCRr7jm9BtGf-UkvvNxCeTKnOuEpV9J9vjtrDiAm-XjOc31ft6k-wu-N2C6g_sfgfkdQj8FqOYaMafPo3WI03r3H3D6e-Datj5rJ4ymFkBZ6ow3U5thgNr5ot226XwM3y_IX1vKpTW0N9aKSgIWijsfHtqlE6LiPdj3xFBF25lRNnheO9Q98pOlHe97CBJoqoMBgmF1Qgt6oYQWSrxDQ-GNq17C747cU53mu4ePkZuC1yFUarSvMaLUS14LfUAqVjuPsUr4pUfhOiyrp0wEg4FiKGNPOa1GXXfUtJQ3jfA5cjkDISSewU4uQDeThuIv3gOn3XjAOiu8QF5BgcYC6eD3gLYH7lAaewFUJU-XNrtUoBFte67t9DjAmuMDjfCp-OWG_wzTuvxzu40_-upO2U7K9neUa9XTa8_3yhZcUOfylo49ORPOZtML70cPYalvYoM4DZPy4hcpnPkYhfZh1PIHene43evxOz0_wHNWqHZv9ZZ7nh-2ndkz9zvIPiR-CdrdMEZQJnmer4s0SYuoKdNmk2545ISTUP4D_AX0VUPjfF96ecTGHPxR48WFSzQOsrwdqwP2_1gta6PwEP6jpmWBvfscbohPAq8tsLjJipytoq7crKGo0g2Lm6ati5RlDAPbJEnSsDxdtTySvAJpS5JtCWMajjSYwD3J9pEoWcxYErMcNYqsWOZZW7dQJMDqhK-zDV7koLiQl1mPhjKEVI0Hi0wprLMfTJwkcdAAwR3a56PrzFDa2jinahUF32WI_V-OyCmP">