https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93264
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- So let's try to address this in cfgloop.c - we're likely facing the situation of header: ... if (...) goto latch1; latch2: goto header; latch1: // in cold section goto header; where latch disambiguation via merge_latch_egdes tries to build header: ... if (...) goto latch1; latch2: goto latch3; latch1: // in cold section goto latch3; latch3: // somewhere goto header; but somehow we end up redirecting a jump that was formerly crossing to non-crossing. Looking at the backtrace it must be entry edges that are being redirected but the whole setup should be so that the crossing state of a branch is never changed. Unfortunately I can't reproduce on todays trunk, will try rewiding backwards to the reporting time to have a closer look.