<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_">