https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110931
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Basically there is a missing VRP happening here: l.0_1 [irange] int [-INF, -65536][0, 0][65536, +INF] Partial equiv (b_6 pe8 l.0_1) <bb 3> : b_6 = (char) l.0_1; ... Obvious that b_6 will have the range [0,0] as the other parts of l.0_1 is outside of that range. But for some reason VRP didn't figure that out here ... I don't understand how this is supposed to work