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

Reply via email to