https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118046
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
From:
```
// char _6;
// int _5;
_5 = *i.3_4;
_6 = (char) _5;
...
_8 = (int) _6;
if (_8 >= 0) // sign bit is not set
goto <bb 5>; [59.00%]
else
goto <bb 4>; [41.00%]
<bb 4> [local count: 220117072]:
_19 = _6 & 1;
if (_19 != 0)
goto <bb 6>; [85.98%]
else
goto <bb 5>; [14.02%]
<bb 5> [local count: 884494828]:
<bb 6> [local count: 1073741824]:
# iftmp.4_11 = PHI <1(4), 0(5)>
```
To
```
_8 = (int) _6;
_19 = _6 & 1;
_22 = _21 & 2147483649;
if (_22 == 2147483649)
goto <bb 5>; [35.25%]
else
goto <bb 4>; [64.75%]
<bb 4> [local count: 884494828]:
<bb 5> [local count: 1073741824]:
# iftmp.4_11 = PHI <1(3), 0(4)>
```
Ifcombine ignored the original truncation for the sign bit comparison ...