Hello,

Hot/cold partitioning is apparently a hot topic all of a sudden, which
is a good thing of course, because it's in need of some TLC.

The attached patch adds another check the RTL cfg checking
(verify_flow_info) for the partitioning: A hot block can never be
dominated by a cold block (because the dominated block must also be
cold). This trips in PR55121.

I haven't tested this with any profiling tests, but it's bound to
break things. From my POV, whatever gets broken by this patch was
already broken to begin with :-)   If you're in CC, it's because I
hope you can help test this patch.

Downside of this patch is that I need dominance info. If it's not
available, I compute and free it. I'm not sure if this works if
dominance info status is DOM_NO_FAST_QUERY, and I don't want to
recompute in this case because IMHO a verifier should be a no-op from
the POV of the rest of the compiler, and updating dominators would
make this patch a not-a-no-op :-)

Thoughts/comments?

Ciao!
Steven

        * cfgrtl.c (rtl_verify_flow_info_1): Verify that blocks in the
        hot partition are not dominated by blocks in the cold partition.

Index: cfgrtl.c
===================================================================
--- cfgrtl.c    (revision 191819)
+++ cfgrtl.c    (working copy)
@@ -2033,6 +2033,7 @@ rtl_verify_flow_info_1 (void)
   rtx x;
   int err = 0;
   basic_block bb;
+  bool have_partitions = false;

   /* Check the general integrity of the basic blocks.  */
   FOR_EACH_BB_REVERSE (bb)
@@ -2145,6 +2146,8 @@ rtl_verify_flow_info_1 (void)
            n_eh++;
          else if (e->flags & EDGE_ABNORMAL)
            n_abnormal++;
+
+         have_partitions |= is_crossing;
        }

       if (n_eh && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
@@ -2263,6 +2268,40 @@ rtl_verify_flow_info_1 (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.  */
+  VEC (basic_block, heap) *bbs_in_cold_partition = NULL;
+  if (have_partitions && !err)
+    FOR_EACH_BB (bb)
+      if ((BB_PARTITION (bb) == BB_COLD_PARTITION))
+       VEC_safe_push (basic_block, heap, bbs_in_cold_partition, bb);
+  if (! VEC_empty (basic_block, bbs_in_cold_partition))
+    {
+      bool dom_calculated_here = !dom_info_available_p (CDI_DOMINATORS);
+      basic_block son;
+
+      if (dom_calculated_here)
+       calculate_dominance_info (CDI_DOMINATORS);
+
+      while (! VEC_empty (basic_block, bbs_in_cold_partition))
+       {
+         bb = VEC_pop (basic_block, bbs_in_cold_partition);
+         if ((BB_PARTITION (bb) != BB_COLD_PARTITION))
+           {
+             error ("non-cold basic block %d dominated "
+                    "by a block in the cold partition", bb->index);
+             err = 1;
+           }
+         for (son = first_dom_son (CDI_DOMINATORS, bb);
+              son;
+              son = next_dom_son (CDI_DOMINATORS, son))
+           VEC_safe_push (basic_block, heap, bbs_in_cold_partition, son);
+       }
+
+      if (dom_calculated_here)
+       free_dominance_info (CDI_DOMINATORS);
+    }
+
   /* Clean up.  */
   return err;
 }

Reply via email to