From: Martin Liska Date: Wed, 21 Jun 2017 12:52:14 +0000 (+0200) Subject: Rework cold and hot label attributes in predict.c. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=93c18375823fdd0e384f673f75e39136719135dd;p=gcc.git Rework cold and hot label attributes in predict.c. 2017-06-21 Martin Liska * 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 * gcc.dg/tree-ssa/attr-hotcold-2.c: Update scanned patterns. From-SVN: r249451 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 12d0ee8a85c..2308d352d94 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-06-21 Martin Liska + + * 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 PR tree-optimization/79489 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index c645bcec9e6..641a8210dad 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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; } diff --git a/gcc/predict.c b/gcc/predict.c index 790be9fbf16..44151bc2e6c 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -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 (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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a31bba470d2..b45fc572543 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-06-21 Martin Liska + + * gcc.dg/tree-ssa/attr-hotcold-2.c: Update scanned patterns. + 2017-06-21 Pierre-Marie de Rodat * gnat.dg/debug11_pkg.adb, gnat.dg/debug11_pkg.ads, diff --git a/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c b/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c index f7a5098709b..184dd10ddae 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/attr-hotcold-2.c @@ -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" } } */