<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140100>140100</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missed VRP with __builtin_popcount() when bitshift with __builtin_{ctzg, clzg}
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
BreadTom
</td>
</tr>
</table>
<pre>
[Godbolt](https://godbolt.org/z/Ybco775zT)
[GCC bug](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120296)
```
extern void f0_unreachable(void);
void f0(unsigned int arg0, unsigned char arg1){
int tmp0;
unsigned int tmp1;
int tmp2[2];
if(arg1){
tmp0 = __builtin_ctzg(arg0, 0);
tmp1 = arg0 >> tmp0;
} else {
tmp0 = __builtin_clzg(arg0, 0);
tmp1 = arg0 << tmp0;
}
tmp2[0] = __builtin_popcount(arg0);
tmp2[1] = __builtin_popcount(tmp1);
if(tmp2[0] != tmp2[1])
f0_unreachable();
}
```
When bitshifting ARG0 till it reaches one (or zero if it is zero), popcount should remain same and should not execute f0_unreachable() with flags -O3 -march=icelake-client.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVEFvozwQ_TXDZZTI2BCSA4cklJ4-fauq2tWeIgMGvGvsCNttN79-ZUKbNK0qLUJCzMx7b549NrdWdlqIHNIdpEXEvevNmO9GwZtHM0SVaf6E3L1pKqMcpAXQde_c0QLbAi2Blt05tTRjB7Q8AS1_VrXJsvT0CHQDZBvg-z1WvvsUXtfLTvsZXvnuJJXiQEvbm-dD5btl3UlgpWyAFTEldLOaaVdkfslWvDgxanwyssGWHLweBa97XikBdB2iAcJ2AUW2cxXQtdeT-waldsjHjgDd41uw7vkYonEAZwE81bnhSM5ciIjvKNxwjC-pOUIh3dHg_JJoga7fEwdSBFbg4VB5qZzUh9qdunPd1BZ5s4DzE9QmTChBYHfA7m66g6xAoazAL2TUP8rsge0_yszswSyBtLgROZpjbbx2b0JXGjMq_hI1rew1alrDd4I0DugrtvOYfJyHyyxMbV_P0Y9eaKyks71sndQdbh_uCTqpFEqHE4mwaLRAoGsz4kmMBmUbktJOf4Gc7vG1dbS98arBUQxcarR8EMh18xrWxqF4EbV34tM-8Vm6HlvFO4uL_xkuBj7WPbBC1kLx32JRKym0W0ZNzpoN2_BI5HGWZIxmhLKoz1tGWp5wRluaxcm6SQiLm2S1YpsN4bSuIplTQlOSxmm8YhlhS5aQNhFNkvANZ226goSE3tVSqachnNJIWutFHickJiRSvBLKvl4fYx6qFpXvLCRESevsBeekUyL_T1orGvz-8O1s7tPtnqxf78VtLWS78_nY4zTAWRH5UeU3V4t0va-WtRmAlqGN-bM4juaXqB3QcvJigZaznaec_g0AAP__d6CGJQ">