https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113134
--- Comment #19 from JuzheZhong <juzhe.zhong at rivai dot ai> --- The loop is: bb 3 -> bb 4 -> bb 5 | |______⬆ |______________⬆ The condition in bb 3 is if (i_21 == 1001). The condition in bb 4 is if (N_13(D) > i_18). Look into lsplit: This loop doesn't satisfy the check of: if (split_loop (loop) || split_loop_on_cond (loop)) In split_loop_on_cond, it's trying to split the loop that condition is loop invariant. However, no matter bb 3 or bb 4, their conditions are not loop invariant. I wonder whether we should add a new kind of loop splitter like: diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-split.cc index 04215fe7937..a4081b9b6f5 100644 --- a/gcc/tree-ssa-loop-split.cc +++ b/gcc/tree-ssa-loop-split.cc @@ -1769,7 +1769,8 @@ tree_ssa_split_loops (void) if (optimize_loop_for_size_p (loop)) continue; - if (split_loop (loop) || split_loop_on_cond (loop)) + if (split_loop (loop) || split_loop_on_cond (loop) + || split_loop_for_early_break (loop)) { /* Mark our containing loop as having had some split inner loops. */ loop_outer (loop)->aux = loop;