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;
+ }
+}
+