Rework cold and hot label attributes in predict.c.
authorMartin Liska <mliska@suse.cz>
Wed, 21 Jun 2017 12:52:14 +0000 (14:52 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 21 Jun 2017 12:52:14 +0000 (12:52 +0000)
2017-06-21  Martin Liska  <mliska@suse.cz>

* gimplify.c (gimplify_label_expr): Insert GIMPLE_PREDICT
statements on cold and hot labels.
* predict.c (tree_estimate_probability_bb): Remove the
prediction from this place.
2017-06-21  Martin Liska  <mliska@suse.cz>

* gcc.dg/tree-ssa/attr-hotcold-2.c: Update scanned patterns.

From-SVN: r249451

gcc/ChangeLog
gcc/gimplify.c
gcc/predict.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c

index 12d0ee8a85ccc0718e6e50fa4c57e76b1eefe5d9..2308d352d94bc98cba4671e4be07678be25b6f28 100644 (file)
@@ -1,3 +1,10 @@
+2017-06-21  Martin Liska  <mliska@suse.cz>
+
+       * gimplify.c (gimplify_label_expr): Insert GIMPLE_PREDICT
+       statements on cold and hot labels.
+       * predict.c (tree_estimate_probability_bb): Remove the
+       prediction from this place.
+
 2017-06-21  Martin Liska  <mliska@suse.cz>
 
        PR tree-optimization/79489
index c645bcec9e680f243ef6c8649501e8b9773fb2b1..641a8210dad66075fe2a351e7f1a7c8893619aab 100644 (file)
@@ -2357,10 +2357,18 @@ gimplify_label_expr (tree *expr_p, gimple_seq *pre_p)
   gcc_assert (decl_function_context (LABEL_EXPR_LABEL (*expr_p))
              == current_function_decl);
 
-  glabel *label_stmt = gimple_build_label (LABEL_EXPR_LABEL (*expr_p));
+  tree label = LABEL_EXPR_LABEL (*expr_p);
+  glabel *label_stmt = gimple_build_label (label);
   gimple_set_location (label_stmt, EXPR_LOCATION (*expr_p));
   gimplify_seq_add_stmt (pre_p, label_stmt);
 
+  if (lookup_attribute ("cold", DECL_ATTRIBUTES (label)))
+    gimple_seq_add_stmt (pre_p, gimple_build_predict (PRED_COLD_LABEL,
+                                                     NOT_TAKEN));
+  else if (lookup_attribute ("hot", DECL_ATTRIBUTES (label)))
+    gimple_seq_add_stmt (pre_p, gimple_build_predict (PRED_HOT_LABEL,
+                                                     TAKEN));
+
   return GS_ALL_DONE;
 }
 
index 790be9fbf16d57c639282c2c0e67f04a74c03b1e..44151bc2e6ce3e0c1a42303f6178a6da0cb9c700 100644 (file)
@@ -2742,29 +2742,6 @@ tree_estimate_probability_bb (basic_block bb, bool local_only)
 
   FOR_EACH_EDGE (e, ei, bb->succs)
     {
-      /* Predict edges to user labels with attributes.  */
-      if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
-       {
-         gimple_stmt_iterator gi;
-         for (gi = gsi_start_bb (e->dest); !gsi_end_p (gi); gsi_next (&gi))
-           {
-             glabel *label_stmt = dyn_cast <glabel *> (gsi_stmt (gi));
-             tree decl;
-
-             if (!label_stmt)
-               break;
-             decl = gimple_label_label (label_stmt);
-             if (DECL_ARTIFICIAL (decl))
-               continue;
-
-             /* Finally, we have a user-defined label.  */
-             if (lookup_attribute ("cold", DECL_ATTRIBUTES (decl)))
-               predict_edge_def (e, PRED_COLD_LABEL, NOT_TAKEN);
-             else if (lookup_attribute ("hot", DECL_ATTRIBUTES (decl)))
-               predict_edge_def (e, PRED_HOT_LABEL, TAKEN);
-           }
-       }
-
       /* Look for block we are guarding (ie we dominate it,
         but it doesn't postdominate us).  */
       if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun) && e->dest != bb
index a31bba470d2ff61328b19ff58ddc860dd574fec7..b45fc5725433dfc36d0859093e354a59f844b2de 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-21  Martin Liska  <mliska@suse.cz>
+
+       * gcc.dg/tree-ssa/attr-hotcold-2.c: Update scanned patterns.
+
 2017-06-21  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * gnat.dg/debug11_pkg.adb, gnat.dg/debug11_pkg.ads,
index f7a5098709b8a1c5f26c5583098aec0dc03f8f5e..184dd10ddaef6d70455dab2e08a4b3d65e55b0ed 100644 (file)
@@ -20,9 +20,9 @@ void f(int x, int y)
 
 /* { dg-final { scan-tree-dump-times "hot label heuristics" 1 "profile_estimate" } } */
 /* { dg-final { scan-tree-dump-times "cold label heuristics" 1 "profile_estimate" } } */
-/* { dg-final { scan-tree-dump-times "block 4, loop depth 0, freq \[1-4\]\[^0-9\]" 3 "profile_estimate" } } */
+/* { dg-final { scan-tree-dump "A \\\[0\\\..*\\\]" "profile_estimate" } } */
 
 /* Note: we're attempting to match some number > 6000, i.e. > 60%.
    The exact number ought to be tweekable without having to juggle
    the testcase around too much.  */
-/* { dg-final { scan-tree-dump-times "block 5, loop depth 0, freq \[6-9\]\[0-9\]\[0-9\]\[0-9\]" 3 "profile_estimate" } } */
+/* { dg-final { scan-tree-dump "B \\\[\[6-9\]\[0-9\]\\\..*\\\]" "profile_estimate" } } */