91 lines
3.6 KiB
Diff
91 lines
3.6 KiB
Diff
From 96b5d381d4a670fd3f2fed4ca73ded601ec779e9 Mon Sep 17 00:00:00 2001
|
|
From: xiezhiheng <xiezhiheng@huawei.com>
|
|
Date: Fri, 24 Nov 2023 15:47:33 +0800
|
|
Subject: [PATCH 3/4] [Backport] Rework cold and hot label attributes in
|
|
predict.c.
|
|
|
|
Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=93c18375823fdd0e384f673f75e39136719135dd
|
|
---
|
|
gcc/gimplify.c | 10 +++++++-
|
|
gcc/predict.c | 23 -------------------
|
|
.../gcc.dg/tree-ssa/attr-hotcold-2.c | 4 ++--
|
|
3 files changed, 11 insertions(+), 26 deletions(-)
|
|
|
|
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
|
|
index 5264a4f3d..c6a06d014 100644
|
|
--- a/gcc/gimplify.c
|
|
+++ b/gcc/gimplify.c
|
|
@@ -2340,10 +2340,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 fa4e626fa..d68fb17ba 100644
|
|
--- a/gcc/predict.c
|
|
+++ b/gcc/predict.c
|
|
@@ -2701,29 +2701,6 @@ tree_estimate_probability_bb (basic_block bb)
|
|
|
|
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);
|
|
- }
|
|
- }
|
|
-
|
|
/* Predict early returns to be probable, as we've already taken
|
|
care for error returns and other cases are often used for
|
|
fast paths through function.
|
|
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 13d2916c4..184dd10dd 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, count 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, count 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" } } */
|
|
--
|
|
2.19.1
|
|
|