<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/65968>65968</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Simplification Comparison (Clang15 vs Clang16)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</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
#define I (-__INT_MAX__ - 1)
int foo(int x, int y)
{
return ((x & I) ^ I) == ((~y & I) ^ I);
}
int bar(int x, int y)
{
return (x ^ y) < 0;
}
```
Clang15 can simplify `foo` to `bar`, but Clang16 (and trunk) cannot.
https://godbolt.org/z/P3fMee9q3
Clang15
```asm
foo(int, int): # @foo(int, int)
mov eax, edi
xor eax, esi
shr eax, 31
ret
bar(int, int): # @bar(int, int)
mov eax, edi
xor eax, esi
shr eax, 31
ret
```
Clang16 (and trunk)
```asm
foo(int, int): # @foo(int, int)
not edi
and edi, -2147483648
and esi, -2147483648
xor eax, eax
cmp edi, esi
sete al
ret
bar(int, int): # @bar(int, int)
mov eax, edi
xor eax, esi
shr eax, 31
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVU2P4jgQ_TWViwVyyvk85EDDIvWhVyvtHvaGnMQBTyc2YzsNzGF--8hJoBsataZHmstYCBeuj_d4ZZW5tXKrhCggfoB4FfDe7bQpnmfcGH2wQanrU7HUyspaGOJ2gjS6bfVBqi1xB02aXlVOamWBLYCugC4goeOn2u-nE2S1aKQS5JEAZrPN5vHv_zZPi_83GzIjIWA-xQ3fUjnSaA2YeesIuCTeOL2GpQ-jQYgRrjfKFwXMjgQwIY-AOYH4r8lgK2CrKeD76X0EsIdz1dUti5KbT7I4DnVPI_KS0DvVz-q8BVu2XG3DmFRcESu7fSubE4GEehkSSpz2PzybhHoiZe_ImJJ4UK5q4kyvnj1sxZXSbj7W3Tm3HxqDa8D1Vtelbt1cmy3g-hvg-h_WPAmRf2V3yNzQ5bYbTy6tmSQZNFyQjxcgIxDRe7mThuPq9MuwCz4oLmp57T9qc-W3N367u_KzcHIb4Ubr0tJfYH8vdyz_22l_cGveXYFPNu5nW6O0Gzle_pwHPZ_gkswwjNIoY0mUXWde4uzHcV6ls0L8eO2ruv1brPcKCicGrPZP63hQF6zOWc4DUYRJHkURRpgHu4KLlJY1D3kTpyypopSFcRTGcR7mqYgEDWSBFBnNwzCMMKXpPKmzGtMsDuM0bERaQURFx2U7b9uXzo-FQFrbiyKJ8yQLWl6K1g7vAqISBzI4AdE_E6bwObOy31qIaCuts69VnHStKP4dB5msuH8fyFJ3e26k1cOgPE-8F3ueZIB50Ju2uJlZ0u36cl7pDnDtAaZttjf6i6gc4HqgZQHXA-0fAQAA__9pZslO">