https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119999
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- It stopped aborting with r14-2709-g65ff4a45b11b5ab13ef849bd5721ab28ff316202 Author: Jan Hubicka AuthorDate: Fri Jul 21 13:54:23 2023 loop-ch improvements, part 5 Currently loop-ch skips all do-while loops. But when loop is not do-while in addition to original goal of turining it to do-while it can do additional things: 1) move out loop invariant computations 2) duplicate loop invariant conditionals and eliminate them in loop body. 3) prove that some exits are always true in first iteration and can be skipped Most of time 1 can be done by lim (exception is when the invariant computation is conditional). For 2 we however don't really have other place doing it except for loop unswitching that is more expensive (it will duplicate the loop and then optimize out one path to non-loop). 3 can be done by loop peeling but it is also more expensive by duplicating full loop body. This patch improves heuristics by not giving up on do-while loops and trying to find sequence of BBs to duplicate to obtain one of goals: - turn loop to do-while - eliminate invariant conditional in loop body - do partial "peeling" as long as code optimizes enough so this does not increase code size.