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