https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102546
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Aldy Hernandez from comment #2) > By VRP1 we seem to be calculating the following: > > (f_8 << f_8) && (f_8 == 0) > > This would fold to false, which would elide the foo(): > > <bb 7> [local count: 59055800]: > b = 0; > _3 = f_8 << f_8; > _4 = (char) _3; > _5 = (int) _4; > if (_4 > 0) > goto <bb 8>; [64.06%] > else > goto <bb 10>; [35.94%] > > <bb 8> [local count: 34842922]: > if (f_8 == 0) > goto <bb 9>; [71.10%] > else > goto <bb 10>; [28.90%] > > <bb 9> [local count: 12809203]: > foo (); I think it's similar to in the other PR, with old EVRP when visiting BB 8 we pushed [1, +INF] as the global range for _4, then supposedly ranger manages to evaluate f_8 == 0 with its backward infering somehow. We no longer do this "path sensitive" adjustment of (global) ranges since you removed the EVRP DOM walk algorithm.