https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105832
--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
I think the simple way of fixing this is optimizing:
```
bool f(int g)
{
return (1 >> g) != 0;
}
```
into
```
bool f0(int g)
{
return g == 0;
}
```
In threadfull1 (before vrp1) we have:
```
<bb 5> [local count: 894749065]:
if (iftmp.0_6 <= 1)
goto <bb 6>; [41.00%]
else
goto <bb 8>; [59.00%]
<bb 6> [local count: 366847113]:
_3 = (int) iftmp.0_6;
_4 = 1 >> _3;
if (_4 == 0)
goto <bb 7>; [50.00%]
else
goto <bb 8>; [50.00%]
<bb 7> [local count: 183423557]:
iftmp.1_12 = iftmp.0_6 << 1;
<bb 8> [local count: 894749065]:
# iftmp.1_7 = PHI <iftmp.1_12(7), iftmp.0_6(5), iftmp.0_6(6)>
```
if we optimize the bb6 to:
```
if (iftmp.0_6 != 0)
goto <bb 7>; [50.00%]
else
goto <bb 8>; [50.00%]
```
We should be able to ifcombine the 2 GIMPLE to just:
iftmp.0_6 != 0 && iftmp.0_6 <= 1
Which then will unswitch correctly ...