https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102879
--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So we have: _28 = d.3_27 == 0; _29 = (int) _28; _31 = _61 >> _29; _41 = _31 == 0; This can be transform into: _41 = ((unsigned)_61) <= (unsigned)_28; (related transformation to PR 119420 but not yet filed) And this: _50 = (int) _41; _45 = _61 >> _50; _1 = _45 == 0; into: _1 = ((unsigned)_61) <= (unsigned)_41; But _1 is the same as _41 (see PR 119422) _2 = (int) _1; _59 = _61 >> _2; d = _59; if (_59 == 0) Similar reason for _59 == 0, this becomes just _41. Though I am not 100% sure that helps here.