<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/56479>56479</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Missing simplification for checking value is sign extended
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          majnemer
      </td>
    </tr>
</table>

<pre>
    Consider a sequence like:
```c++
bool src(int x) {
  return __builtin_clrsb(x) >= (32 - bits);
}
```

We turn this into:
```llvm
define dso_local zeroext i1 @src(i32 noundef %0) local_unnamed_addr #0 {
  %2 = ashr i32 %0, 31
  %3 = xor i32 %2, %0
  %4 = icmp ult i32 %3, 4
  ret i1 %4
}
```

However, it is equivalent to:
```llvm
define dso_local zeroext i1 @tgt(i32 noundef %0) local_unnamed_addr #0 {
  %2 = add i32 %0, 4
  %3 = icmp ult i32 %2, 8
  ret i1 %3
}
```

We get this if we wrote the following C++:
```c++
bool tgt(int x) {
  using ty = _BitInt(3);
  return int(ty(x)) == x;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytU8tu2zAQ_BrpsoghkfLroEMSN2gPPfcoUOJKYkKRLknFSb--S8pN3KQoArQAYYvc2dfsbGvlc31rjVcSHQjw-H1G0yFo9YAZv86KQ1ZcZ5tiOV3GbuJJr621Gryjt50yAZ4ytodsezYCOAyzM9A07ax0UKbptPMtgRcg_5TxA9CVM7iCVgVPzxk_u2fbw5vU52v6_YaQYodReaDc9n2lWj9Oy5PEXhkE6W2jbSc0_EBn8SmAKiGrinMDVIWxsyEw1bQuYokJ3czGiAllI6R0ZOLFZY8EZRD7EH50EIMszrfAywsMT5gn-wJhEZKgr6AqgVQ3HWHW4ReSR2R1wWkqm9Af4emzPeEjuhhCkaMHmq56FBppXP9EWhjC_yBNyt84q95R9paNxNvuPRv8g6oZyGMRTQ8nhJOzgaQ0IvRWa3tSZoDbs8Q_oP0zC3_Q_uxjqPCcmmhuVPhiIpRfSvxlQ1SyhefzaizbcUiK-cs-5LLmcs_3Ig8qaKy_Kp-SejUdtepVJ4Kyhhpz0I3YPUQbjX7GqAOvBgM0TqTZyXx2uh5DOPrYNLujM6gwzu2qsxNdkiqWv6ujs_fYUb13lG5G2tm79aba7vOx3vWIXblZs76SG1bIfS84YxVdkbVY8FyLFrWvszXRyAyeIIWg72x9yFXNCsaKbVmW1FRZrLaFQN733brbVKXY70h1OAmlV7GOlXVD7upUUjsPnoxa-eBfjcLHHhFTOoov5jBaV0_i3uCELk-561T7Tx5maZU">