aboutsummaryrefslogtreecommitdiff
path: root/gcc/profile-count.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2019-05-09 15:03:28 +0200
committerMartin Liska <marxin@gcc.gnu.org>2019-05-09 13:03:28 +0000
commitd276406ac1e7fc7f9c380325c994cf477b3d6fb8 (patch)
treeaaacbcded0429a0522a06ff2c662c5f3910bcaf4 /gcc/profile-count.c
parent555dbc42b2dfed0c9e70e9e53fcd569f82aeae02 (diff)
downloadgcc-d276406ac1e7fc7f9c380325c994cf477b3d6fb8.zip
gcc-d276406ac1e7fc7f9c380325c994cf477b3d6fb8.tar.gz
gcc-d276406ac1e7fc7f9c380325c994cf477b3d6fb8.tar.bz2
Support profile (BB counts and edge probabilities) in GIMPLE FE.
2019-05-09 Martin Liska <mliska@suse.cz> * tree-cfg.c (dump_function_to_file): Dump entry BB count. * gimple-pretty-print.c (dump_gimple_bb_header): Dump BB count. (pp_cfg_jump): Dump edge probability. * profile-count.c (profile_quality_as_string): Simplify with a static array. (parse_profile_quality): New function. (profile_count::dump): Simplify with a static array. (profile_count::from_gcov_type): Add new argument. * profile-count.h (parse_profile_quality): Likewise. * predict.h (set_hot_bb_threshold): New. * params.def (PARAM_GIMPLE_FE_COMPUTED_HOT_BB_THRESHOLD): New param. * predict.c (get_hot_bb_threshold): Set from the new param. (set_hot_bb_threshold): New. 2019-05-09 Martin Liska <mliska@suse.cz> * gimple-parser.c (struct gimple_parser): Add probability. for gimple_parser_edge. (gimple_parser::push_edge): Add new argument probability. (c_parser_gimple_parse_bb_spec): Parse also probability if present. (c_parser_parse_gimple_body): Set edge probability. (c_parser_gimple_compound_statement): Consume token before calling c_parser_gimple_goto_stmt. Parse BB counts. (c_parser_gimple_statement): Pass new argument. (c_parser_gimple_goto_stmt): Likewise. (c_parser_gimple_if_stmt): Likewise. (c_parser_gimple_or_rtl_pass_list): Parse hot_bb_threshold. * c-parser.c (c_parser_declaration_or_fndef): Pass hot_bb_threshold argument. * c-tree.h (struct c_declspecs): Add hot_bb_threshold field. (c_parser_gimple_parse_bb_spec_edge_probability): New. 2019-05-09 Martin Liska <mliska@suse.cz> * gcc.dg/gimplefe-37.c: New test. * gcc.dg/gimplefe-33.c: Likewise. From-SVN: r271034
Diffstat (limited to 'gcc/profile-count.c')
-rw-r--r--gcc/profile-count.c88
1 files changed, 48 insertions, 40 deletions
diff --git a/gcc/profile-count.c b/gcc/profile-count.c
index 8c58f86..4f0bac0 100644
--- a/gcc/profile-count.c
+++ b/gcc/profile-count.c
@@ -33,34 +33,57 @@ along with GCC; see the file COPYING3. If not see
#include "wide-int.h"
#include "sreal.h"
+/* Names from profile_quality enum values. */
+
+const char *profile_quality_names[] =
+{
+ "uninitialized",
+ "guessed_local",
+ "guessed_global0",
+ "guessed_global0adjusted",
+ "guessed",
+ "afdo",
+ "adjusted",
+ "precise"
+};
+
/* Get a string describing QUALITY. */
const char *
profile_quality_as_string (enum profile_quality quality)
{
- switch (quality)
- {
- default:
- gcc_unreachable ();
- case profile_uninitialized:
- return "uninitialized";
- case profile_guessed_local:
- return "guessed_local";
- case profile_guessed_global0:
- return "guessed_global0";
- case profile_guessed_global0adjusted:
- return "guessed_global0adjusted";
- case profile_guessed:
- return "guessed";
- case profile_afdo:
- return "afdo";
- case profile_adjusted:
- return "adjusted";
- case profile_precise:
- return "precise";
- }
+ return profile_quality_names[quality];
+}
+
+/* Parse VALUE as profile quality and return true when a valid QUALITY. */
+
+bool
+parse_profile_quality (const char *value, profile_quality *quality)
+{
+ for (unsigned i = 0; i < ARRAY_SIZE (profile_quality_names); i++)
+ if (strcmp (profile_quality_names[i], value) == 0)
+ {
+ *quality = (profile_quality)i;
+ return true;
+ }
+
+ return false;
}
+/* Display names from profile_quality enum values. */
+
+const char *profile_quality_display_names[] =
+{
+ NULL,
+ "estimated locally",
+ "estimated locally, globally 0",
+ "estimated locally, globally 0 adjusted",
+ "adjusted",
+ "auto FDO",
+ "guessed",
+ "precise"
+};
+
/* Dump THIS to F. */
void
@@ -69,23 +92,8 @@ profile_count::dump (FILE *f) const
if (!initialized_p ())
fprintf (f, "uninitialized");
else
- {
- fprintf (f, "%" PRId64, m_val);
- if (m_quality == profile_guessed_local)
- fprintf (f, " (estimated locally)");
- else if (m_quality == profile_guessed_global0)
- fprintf (f, " (estimated locally, globally 0)");
- else if (m_quality == profile_guessed_global0adjusted)
- fprintf (f, " (estimated locally, globally 0 adjusted)");
- else if (m_quality == profile_adjusted)
- fprintf (f, " (adjusted)");
- else if (m_quality == profile_afdo)
- fprintf (f, " (auto FDO)");
- else if (m_quality == profile_guessed)
- fprintf (f, " (guessed)");
- else if (m_quality == profile_precise)
- fprintf (f, " (precise)");
- }
+ fprintf (f, "%" PRId64 " (%s)", m_val,
+ profile_quality_display_names[m_quality]);
}
/* Dump THIS to stderr. */
@@ -362,7 +370,7 @@ profile_count::combine_with_ipa_count (profile_count ipa)
Conversions back and forth are used to read the coverage and get it
into internal representation. */
profile_count
-profile_count::from_gcov_type (gcov_type v)
+profile_count::from_gcov_type (gcov_type v, profile_quality quality)
{
profile_count ret;
gcc_checking_assert (v >= 0);
@@ -371,7 +379,7 @@ profile_count::from_gcov_type (gcov_type v)
"Capping gcov count %" PRId64 " to max_count %" PRId64 "\n",
(int64_t) v, (int64_t) max_count);
ret.m_val = MIN (v, (gcov_type)max_count);
- ret.m_quality = profile_precise;
+ ret.m_quality = quality;
return ret;
}