<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/72773>72773</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang is suboptimal for `(~a ^ b) ? a : (a ^ b)`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
k-arrows
</td>
</tr>
</table>
<pre>
Consider the following two functions:
```cpp
int foo(int a, int b)
{
return (~a ^ b) ? a : (a ^ b);
}
int bar(int a, int b)
{
return ~(a ^ b) ? a : (a ^ b);
}
```
Clang vs GCC:
https://godbolt.org/z/74oKjPaoq
Alive2:
https://alive2.llvm.org/ce/z/DP5a_J
```llvm
define i32 @src(i32 %x, i32 %y) {
0:
%xor1 = xor i32 %y, %x
%cmp = icmp eq i32 %xor1, 4294967295
%sel = select i1 %cmp, i32 %y, i32 0
%xor2 = xor i32 %sel, %x
ret i32 %xor2
}
=>
define i32 @tgt(i32 %x, i32 %y) {
0:
%xor = xor i32 %y, %x
%cmp = icmp eq i32 %xor, 4294967295
%sel = select i1 %cmp, i32 4294967295, i32 %x
ret i32 %sel
}
Transformation seems to be correct!
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVM1u4ywUfRq8uWqEAf8tvEiT-pO-2XQx-xG2sUMHmxRw086izz4C58eJOtK0I0XKNT7n3MMxF26t7EchSpTco2Qb8cnttCl_3nFj9MFGtW7fyo0erWyFAbcT0Gml9EGOPbiDhm4aGyf1aBFdI7xFeI1SPP-a_X5ekaODTmtEcl9xRDbgixqR4kjJ7ucCjHCTGQGR_J0DSh4CCBCtgAOia__iso7o_Ym_PRbnfjU3n-j3fqX7iX6nvS7bbxQfe3ix8N9mc05l59w-ZEQqRKpet7VWbqVNj0j1C5EqY_rb0yPXz0ultZIvgvxBg4eXK6VehqNOI45i28eE__h_qXQ26uHzUis6OQqQlABi2JrG5-UfSPIaIpvrtxDIKTB8NgMBqE0MiG7hVZsFYTOLXHDNsA8w6QvxfIJ6ukczUrAizUiRLDhWqMCxQonGgYyPQtfe5hpfeyK3nqxQt66McAsb5PbD0i2iDx8F5Xr3taD-Lacvx7QgXbx-lILP6DqE74aPttNm4H7CwQoxWHAaagGNNkY0DpH45nxFbUnbghY8EmWcYUxTliV5tCt5VtS463jciablnLVJW5M8rtu8oayIm0iWBBMax3GBKSU0X9GcdSnrGGM5S1nNEMNi4FKdj3wkrZ1EmZEso5HitVA2XGOENH4EESH-RjOlx9_VU28Rw0paZy8KTjolygAHacFOtd47OXAFnf9iKf7LmyjF0WRUeTPl0u2metXoAZEqDN78d7c3-imkV4UdWD__fhO_AwAA__930H69">