https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81090
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- Ah, it is CFG cleanup removing a loop exit edge but not updating loop info it seems. So when remove_edge calls rescan_loop_exit it doesn't adjust bounds. So either we are not supposed to keep those "live" at all or we somehow need to manage them as well during CFG cleanup and other loop opts...