Hi, this is the secodn half of fix for PR83575 which avoids ICE in the quite rare scenarios bb-reorder produces fixable partition but we can't fix it because bb order is already fixed :) This is done by skipping verification during this transition and enforcing this missed optimization check only when we are in layout mode.
Plan to commit after x86_64-linux testing finishes. PR middle-end/83575 * cfgrtl.c (rtl_verify_edges): Only verify fixability of partition when in layout mode. (cfg_layout_finalize): Do not verify cfg before we are out of layout. * cfgcleanup.c (try_optimize_cfg): Only verify flow info when doing partition fixup. * gcc.c-torture/compile/pr83575.c: New testcase. Index: cfgrtl.c =================================================================== --- cfgrtl.c (revision 256423) +++ cfgrtl.c (working copy) @@ -2615,7 +2615,8 @@ rtl_verify_edges (void) /* If there are partitions, do a sanity check on them: A basic block in a cold partition cannot dominate a basic block in a hot partition. */ - if (crtl->has_bb_partition && !err) + if (crtl->has_bb_partition && !err + && current_ir_type () == IR_RTL_CFGLAYOUT) { vec<basic_block> bbs_to_fix = find_partition_fixes (true); err = !bbs_to_fix.is_empty (); @@ -4322,7 +4323,6 @@ break_superblocks (void) void cfg_layout_finalize (void) { - checking_verify_flow_info (); free_dominance_info (CDI_DOMINATORS); force_one_exit_fallthru (); rtl_register_cfg_hooks (); Index: cfgcleanup.c =================================================================== --- cfgcleanup.c (revision 256423) +++ cfgcleanup.c (working copy) @@ -3013,8 +3013,10 @@ try_optimize_cfg (int mode) is only visible after newly unreachable blocks are deleted, which will be done in fixup_partitions. */ if ((mode & CLEANUP_NO_PARTITIONING) == 0) - fixup_partitions (); - checking_verify_flow_info (); + { + fixup_partitions (); + checking_verify_flow_info (); + } } changed_overall |= changed; Index: testsuite/gcc.c-torture/compile/pr83575.c =================================================================== --- testsuite/gcc.c-torture/compile/pr83575.c (revision 0) +++ testsuite/gcc.c-torture/compile/pr83575.c (working copy) @@ -0,0 +1,33 @@ +/* { dg-options "-O2 -funroll-loops -fno-tree-dominator-opts -fno-tree-loop-im -fno-code-hoisting -fno-tree-pre -fno-guess-branch-probability" } */ +int tw, be; + +void +fp (void) +{ + if (tw == 0) + goto gq; + else if (be == 0) + goto ob; + else + return; + + for (;;) + if (tw < 1) + { + while (tw < 1) + { + gq: + tw = 0; + } + + while (be < 1) + { + ob: + tw = 0; + } + + while (be < 1) + ++be; + } +} +