<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/75613>75613</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Value Range: clang cannot know `(a >> 3 == -2)` means `a` in [ -16, -9]
</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>
Test case:
https://godbolt.org/z/daYcYhxad
```cpp
bool foo(int a)
{
if ((a >> 3) + 2 == 0) return true;
else return (a < -16 || a > -9);
}
```
Some generalizations will be necessary, but this is motivated from the following gcc testsuite:
https://github.com/gcc-mirror/gcc/blob/master/gcc/testsuite/gcc.dg/tree-ssa/vrp76.c
Clang13 can optimize the above function `foo`, but it cannot the original `f3`. Therefore, there may be problems that differ from the value range. Sorry if my example is inappropriate.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8U9GOqzgM_Rr3xSoKSaHwwMNMe_mAvVcr3UcDBrI3JCgJndv5-lXodGe00q6EAJtj43NyTCHoyTI3ULxCcT3QFmfnm19H8t69hUPnhnvzg0PEngKDegFxBfEyx7iGFMkWZDu5oXMmZs5PINt3kO1AP_uf828aHnAoxePq1_WR6ZwzODoHstI2IoGsP6Dn18cLoh4RZAWyIgT1DdQ3VCBrBPmKEkFdQV1RpIznuHmL0W8M6p9yNoGfnz6aXPCYlwjnC5wvuHfFY51-_ayC8_VfE3-E-_27WxgntuzJ6HeK2tmAb9oY7Bgt9xwC-TvIC3ZbxDjrgDrg4qK-UeQBR-8WjDPj6Ixxb9pOOPU9Rg4xbDr-p7w6zluX9W5JQd8fF-29848AZNsZ14FsFwqRP7OfXfdMNqSziZ75GAKBbG9-PZdZ_5XfxZCdcoU9WXRr1It-531e6tyNcdxsnzgjlCIdXSmeVHWyh7Uu7mjn9aQtmR2noBQZ_pjZ8-g8p4qYAlzonmRbvesMLwHjTBEHPY7sP4W6kdkYPdmJM_zuvL8nVyx35N-0rIaTvtrSunq3ek2RsweTw9CooVY1HbjJz0KWhahO1WFuOqaTVIKUKmouRTdSXxR9QVSpfqhlftCNFFLlMi_ykzqJKhN5NdT1mFdCVWPJEk6CF9ImM-a2JMsfdAgbN-eizNXBUMcm7NskZZ_0BCnTYvkm4Y_dNgU4CaNDDJ8doo6Gmz93sn8ksqBecK9-6vrLujfcFf-yDc8lOMrk4VLgwmRDglGKtEUoXpPlk-rHOo2xedP8j7vSRB-P4-rdX9xHkO1OMIBsd45_BwAA___fFUd_">