https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110131
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #1) > _33 = (intD.6) _13; > # RANGE [irange] unsigned int [2, 32767][4294934528, +INF] > _29 = (unsigned int) _13; > # RANGE [irange] unsigned int [0, 0][3, 32768][4294934529, +INF] > _37 = _29 + 1; > _21 = _37 <= 2; > # RANGE [irange] int [-32768, 0][2, 32767] > _34 = _21 ? _33 : 0; > if (_34 != 5) > > First: > _t = _33 != 5 > _t1 = _21 & _t > if (_t1 != 0) > > Second: > _21 = _37 == 0 (because that is the only value that is less than or equal to > 2 it could be) > > So: > _21 = _29 == UINT_MAX > or: > _21 = _33 == -1 > > But since _33 != 5 > > so _t1 is 0. Actually I got this wrong. It should just be _33 == -1 here. But that can't be true as _33's range should not include -1.