[google] Suppress FDO-use related notes/warnings (issue5294043)
Xinliang David Li
davidxl@google.com
Wed Oct 19 06:40:00 GMT 2011
On Tue, Oct 18, 2011 at 3:48 PM, Rong Xu <xur@google.com> wrote:
> Suppress verbose notes/warnings printed in FDO-use compilation.
> (1) Add option -fprofile-use-verbose.
Gcc currently does not emit informational messages on high level
transformations such as inlining, value profiling transformations (ic
promotion info messages are emitted in lipo mode in google/main), loop
peeling and unrolling, and other loop opts. I can see those are very
useful for triaging performance regressions etc, but turning those on
would be too verbose for non-power users and can be annoying. They
(when introduced in the future) should be guarded. I can see they
should be guarded using the same option and possibly with a verbose
level. Something like:
-fopt-info=<1,2,3>
For now, a nonparameterized option should be good enough.
(similarly, -fopt-report can be used to dump optimization report which
is more structured -- e.g, grouped via optimizations, not functions).
There are some unrelated changes (e.g, histogram free etc) which
should be committed separately.
David
> When this option is on, FDO-use
> compilation prints out all the notes as that of today. When this
> option is off (the default), all notes are suppressed.
> (2) Make several unconditional warnings under OPT_Wcoverage_mismatch.
> So that they can be turned off via -Wno-coverage-mismatch.
> (3) Make several unconditional warnings for LIPO under flag_ripa_verbose.
> (can be turned on via -fripa-verbose).
>
> This patch is for google-main only.
>
> Tested with bootstrap and regression tests.
>
> 2011-10-18 Rong Xu <xur@google.com>
>
> * gcc/common.opt (fprofile-use-verbose): New flag.
> * gcc/value-prof.c (check_ic_counter): guard notes by
> flag_profile_use_verbose.
> (find_func_by_funcdef_no): Ditto.
> (check_ic_target): Ditto.
> (check_counter): Ditto.
> (check_ic_counter): Ditto.
> * gcc/mcf.c (find_minimum_cost_flow): Ditto.
> * gcc/profile.c (read_profile_edge_counts):
> (compute_branch_probabilities):
> * gcc/coverage.c (read_counts_file): guard LIPO
> warnings by flag_ripa_verbose.
> (get_coverage_counts): guard notes
> by flag_profile_use_verbose; make warning
> under OPT_Wcoverage_mismatch.
> * gcc/tree-profile.c: (gimple_gen_reusedist): Ditto.
> (maybe_issue_profile_use_note): Ditto.
> (optimize_reusedist): Ditto.
> * gcc/testsuite/gcc.dg/pr32773.c: add -fprofile-use-verbose.
> * gcc/testsuite/gcc.dg/pr40209.c: Ditto.
> * gcc/testsuite/gcc.dg/pr26570.c: Ditto.
> * gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C: Ditto.
>
> Index: gcc/value-prof.c
> ===================================================================
> --- gcc/value-prof.c (revision 180106)
> +++ gcc/value-prof.c (working copy)
> @@ -472,9 +472,10 @@
> : DECL_SOURCE_LOCATION (current_function_decl);
> if (flag_profile_correction)
> {
> - inform (locus, "correcting inconsistent value profile: "
> - "%s profiler overall count (%d) does not match BB count "
> - "(%d)", name, (int)*all, (int)bb_count);
> + if (flag_profile_use_verbose)
> + inform (locus, "correcting inconsistent value profile: %s "
> + "profiler overall count (%d) does not match BB count "
> + "(%d)", name, (int)*all, (int)bb_count);
> *all = bb_count;
> if (*count > *all)
> *count = *all;
> @@ -510,33 +511,42 @@
> location_t locus;
> if (*count1 > all && flag_profile_correction)
> {
> - locus = (stmt != NULL)
> - ? gimple_location (stmt)
> - : DECL_SOURCE_LOCATION (current_function_decl);
> - inform (locus, "Correcting inconsistent value profile: "
> - "ic (topn) profiler top target count (%ld) exceeds "
> - "BB count (%ld)", (long)*count1, (long)all);
> + if (flag_profile_use_verbose)
> + {
> + locus = (stmt != NULL)
> + ? gimple_location (stmt)
> + : DECL_SOURCE_LOCATION (current_function_decl);
> + inform (locus, "Correcting inconsistent value profile: "
> + "ic (topn) profiler top target count (%ld) exceeds "
> + "BB count (%ld)", (long)*count1, (long)all);
> + }
> *count1 = all;
> }
> if (*count2 > all && flag_profile_correction)
> {
> - locus = (stmt != NULL)
> - ? gimple_location (stmt)
> - : DECL_SOURCE_LOCATION (current_function_decl);
> - inform (locus, "Correcting inconsistent value profile: "
> - "ic (topn) profiler second target count (%ld) exceeds "
> - "BB count (%ld)", (long)*count2, (long)all);
> + if (flag_profile_use_verbose)
> + {
> + locus = (stmt != NULL)
> + ? gimple_location (stmt)
> + : DECL_SOURCE_LOCATION (current_function_decl);
> + inform (locus, "Correcting inconsistent value profile: "
> + "ic (topn) profiler second target count (%ld) exceeds "
> + "BB count (%ld)", (long)*count2, (long)all);
> + }
> *count2 = all;
> }
>
> if (*count2 > *count1)
> {
> - locus = (stmt != NULL)
> - ? gimple_location (stmt)
> - : DECL_SOURCE_LOCATION (current_function_decl);
> - inform (locus, "Corrupted topn ic value profile: "
> - "first target count (%ld) is less than the second "
> - "target count (%ld)", (long)*count1, (long)*count2);
> + if (flag_profile_use_verbose)
> + {
> + locus = (stmt != NULL)
> + ? gimple_location (stmt)
> + : DECL_SOURCE_LOCATION (current_function_decl);
> + inform (locus, "Corrupted topn ic value profile: "
> + "first target count (%ld) is less than the second "
> + "target count (%ld)", (long)*count1, (long)*count2);
> + }
> return true;
> }
>
> @@ -548,12 +558,16 @@
> *count2 = all - *count1;
> else
> {
> - locus = (stmt != NULL)
> - ? gimple_location (stmt)
> - : DECL_SOURCE_LOCATION (current_function_decl);
> - inform (locus, "Corrupted topn ic value profile: top two targets's"
> - " total count (%ld) exceeds bb count (%ld)",
> - (long)(*count1 + *count2), (long)all);
> + if (flag_profile_use_verbose)
> + {
> + locus = (stmt != NULL)
> + ? gimple_location (stmt)
> + : DECL_SOURCE_LOCATION (current_function_decl);
> + inform (locus,
> + "Corrupted topn ic value profile: top two targets's"
> + " total count (%ld) exceeds bb count (%ld)",
> + (long)(*count1 + *count2), (long)all);
> + }
> return true;
> }
> }
> @@ -1177,8 +1191,11 @@
> func_id) == NULL)
> {
> if (flag_profile_correction)
> - inform (DECL_SOURCE_LOCATION (current_function_decl),
> + {
> + if (flag_profile_use_verbose)
> + inform (DECL_SOURCE_LOCATION (current_function_decl),
> "Inconsistent profile: indirect call target (%d) does not exist", func_id);
> + }
> else
> error ("Inconsistent profile: indirect call target (%d) does not exist", func_id);
>
> @@ -1308,8 +1325,9 @@
> return true;
>
> locus = gimple_location (call_stmt);
> - inform (locus, "Skipping target %s with mismatching types for icall ",
> - cgraph_node_name (target));
> + if (flag_profile_use_verbose)
> + inform (locus, "Skipping target %s with mismatching types for icall ",
> + cgraph_node_name (target));
> return false;
> }
>
> Index: gcc/mcf.c
> ===================================================================
> --- gcc/mcf.c (revision 180106)
> +++ gcc/mcf.c (working copy)
> @@ -1442,7 +1442,8 @@
> if (iteration > MAX_ITER (fixup_graph->num_vertices,
> fixup_graph->num_edges))
> {
> - inform (DECL_SOURCE_LOCATION (current_function_decl),
> + if (flag_profile_use_verbose)
> + inform (DECL_SOURCE_LOCATION (current_function_decl),
> "Exiting profile correction early to avoid excessive "
> "compile time");
> break;
> Index: gcc/testsuite/gcc.dg/pr32773.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/pr32773.c (revision 180106)
> +++ gcc/testsuite/gcc.dg/pr32773.c (working copy)
> @@ -1,6 +1,6 @@
> /* { dg-do compile } */
> -/* { dg-options "-O -fprofile-use" } */
> -/* { dg-options "-O -m4 -fprofile-use" { target sh-*-* } } */
> +/* { dg-options "-O -fprofile-use -fprofile-use-verbose" } */
> +/* { dg-options "-O -m4 -fprofile-use -fprofile-use-verbose" { target sh-*-* } } */
>
> void foo (int *p)
> {
> Index: gcc/testsuite/gcc.dg/pr40209.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/pr40209.c (revision 180106)
> +++ gcc/testsuite/gcc.dg/pr40209.c (working copy)
> @@ -1,5 +1,5 @@
> /* { dg-do compile } */
> -/* { dg-options "-O2 -fprofile-use" } */
> +/* { dg-options "-O2 -fprofile-use -fprofile-use-verbose" } */
>
> void process(const char *s);
>
> Index: gcc/testsuite/gcc.dg/pr26570.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/pr26570.c (revision 180106)
> +++ gcc/testsuite/gcc.dg/pr26570.c (working copy)
> @@ -1,5 +1,5 @@
> /* { dg-do compile } */
> -/* { dg-options "-O2 -fprofile-generate -fprofile-use" } */
> +/* { dg-options "-O2 -fprofile-generate -fprofile-use -fprofile-use-verbose" } */
>
> unsigned test (unsigned a, unsigned b)
> {
> Index: gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C
> ===================================================================
> --- gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C (revision 180106)
> +++ gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C (working copy)
> @@ -1,7 +1,7 @@
> // PR tree-optimization/39557
> // invalid post-dom info leads to infinite loop
> // { dg-do run }
> -// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fno-rtti" }
> +// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fprofile-use-verbose -fno-rtti" }
>
> struct C
> {
> Index: gcc/profile.c
> ===================================================================
> --- gcc/profile.c (revision 180106)
> +++ gcc/profile.c (working copy)
> @@ -414,7 +414,7 @@
> if (flag_profile_correction)
> {
> static bool informed = 0;
> - if (!informed)
> + if (flag_profile_use_verbose && !informed)
> inform (input_location,
> "corrupted profile info: edge count exceeds maximal count");
> informed = 1;
> @@ -635,7 +635,7 @@
> {
> /* Inconsistency detected. Make it flow-consistent. */
> static int informed = 0;
> - if (informed == 0)
> + if (flag_profile_use_verbose && informed == 0)
> {
> informed = 1;
> inform (input_location, "correcting inconsistent profile data");
> @@ -754,7 +754,8 @@
> }
> counts_to_freqs ();
> profile_status = PROFILE_READ;
> - compute_function_frequency ();
> + /* TODO: investigate performance regression with this.
> + compute_function_frequency (); */
>
> if (dump_file)
> {
> @@ -837,7 +838,8 @@
> }
>
> for (t = 0; t < GCOV_N_VALUE_COUNTERS; t++)
> - free (histogram_counts[t]);
> + if (histogram_counts[t])
> + free (histogram_counts[t]);
> }
>
> /* The entry basic block will be moved around so that it has index=1,
> @@ -861,7 +863,7 @@
> return;
> }
>
> - name_differs = !prev_file_name || filename_cmp (file_name, prev_file_name);
> + name_differs = !prev_file_name || strcmp (file_name, prev_file_name);
> line_differs = prev_line != line;
>
> if (name_differs || line_differs)
> @@ -1140,14 +1142,17 @@
> /* Line numbers. */
> if (coverage_begin_output (lineno_checksum, cfg_checksum))
> {
> + gcov_position_t offset;
> +
> /* Initialize the output. */
> output_location (NULL, 0, NULL, NULL);
>
> FOR_EACH_BB (bb)
> {
> gimple_stmt_iterator gsi;
> - gcov_position_t offset = 0;
>
> + offset = 0;
> +
> if (bb == ENTRY_BLOCK_PTR->next_bb)
> {
> expanded_location curr_location =
> @@ -1164,14 +1169,15 @@
> &offset, bb);
> }
>
> - /* Notice GOTO expressions eliminated while constructing the CFG. */
> + /* Notice GOTO expressions we eliminated while constructing the
> + CFG. */
> if (single_succ_p (bb)
> && single_succ_edge (bb)->goto_locus != UNKNOWN_LOCATION)
> {
> - expanded_location curr_location
> - = expand_location (single_succ_edge (bb)->goto_locus);
> - output_location (curr_location.file, curr_location.line,
> - &offset, bb);
> + location_t curr_location = single_succ_edge (bb)->goto_locus;
> + /* ??? The FILE/LINE API is inconsistent for these cases. */
> + output_location (LOCATION_FILE (curr_location),
> + LOCATION_LINE (curr_location), &offset, bb);
> }
>
> if (offset)
> Index: gcc/coverage.c
> ===================================================================
> --- gcc/coverage.c (revision 180106)
> +++ gcc/coverage.c (working copy)
> @@ -575,29 +575,47 @@
> int fd;
> char *aux_da_filename = get_da_file_name (mod_info->da_filename);
> gcc_assert (!mod_info->is_primary);
> - if (pointer_set_insert (modset, (void *)(size_t)mod_info->ident))
> - inform (input_location, "Not importing %s: already imported",
> - mod_info->source_filename);
> - else if ((module_infos[0]->lang & GCOV_MODULE_LANG_MASK) !=
> - (mod_info->lang & GCOV_MODULE_LANG_MASK))
> - inform (input_location, "Not importing %s: source language"
> - " different from primary module's source language",
> - mod_info->source_filename);
> - else if (module_infos_read == max_group)
> - inform (input_location, "Not importing %s: maximum group size"
> - " reached", mod_info->source_filename);
> - else if (incompatible_cl_args (module_infos[0], mod_info))
> - inform (input_location, "Not importing %s: command-line"
> - " arguments not compatible with primary module",
> - mod_info->source_filename);
> - else if ((fd = open (aux_da_filename, O_RDONLY)) < 0)
> - inform (input_location, "Not importing %s: couldn't open %s",
> - mod_info->source_filename, aux_da_filename);
> - else if ((mod_info->lang & GCOV_MODULE_ASM_STMTS)
> - && flag_ripa_disallow_asm_modules)
> - inform (input_location, "Not importing %s: contains assembler"
> - " statements", mod_info->source_filename);
> - else
> + if (pointer_set_insert (modset, (void *)(size_t)mod_info->ident))
> + {
> + if (flag_ripa_verbose)
> + inform (input_location, "Not importing %s: already imported",
> + mod_info->source_filename);
> + }
> + else if ((module_infos[0]->lang & GCOV_MODULE_LANG_MASK) !=
> + (mod_info->lang & GCOV_MODULE_LANG_MASK))
> + {
> + if (flag_ripa_verbose)
> + inform (input_location, "Not importing %s: source language"
> + " different from primary module's source language",
> + mod_info->source_filename);
> + }
> + else if (module_infos_read == max_group)
> + {
> + if (flag_ripa_verbose)
> + inform (input_location, "Not importing %s: maximum group"
> + " size reached", mod_info->source_filename);
> + }
> + else if (incompatible_cl_args (module_infos[0], mod_info))
> + {
> + if (flag_ripa_verbose)
> + inform (input_location, "Not importing %s: command-line"
> + " arguments not compatible with primary module",
> + mod_info->source_filename);
> + }
> + else if ((fd = open (aux_da_filename, O_RDONLY)) < 0)
> + {
> + if (flag_ripa_verbose)
> + inform (input_location, "Not importing %s: couldn't open %s",
> + mod_info->source_filename, aux_da_filename);
> + }
> + else if ((mod_info->lang & GCOV_MODULE_ASM_STMTS)
> + && flag_ripa_disallow_asm_modules)
> + {
> + if (flag_ripa_verbose)
> + inform (input_location, "Not importing %s: contains "
> + "assembler statements", mod_info->source_filename);
> + }
> + else
> {
> close (fd);
> module_infos_read++;
> @@ -676,7 +694,7 @@
> {
> static int warned = 0;
>
> - if (!warned++)
> + if (flag_profile_use_verbose && !warned++)
> inform (input_location, (flag_guess_branch_prob
> ? "file %s not found, execution counts estimated"
> : "file %s not found, execution counts assumed to be zero"),
> @@ -689,7 +707,8 @@
> if (!entry)
> {
> if (!flag_dyn_ipa)
> - warning (0, "no coverage for function %qE found",
> + warning (OPT_Wcoverage_mismatch,
> + "no coverage for function %qE found",
> DECL_ASSEMBLER_NAME (current_function_decl));
> return NULL;
> }
> @@ -705,7 +724,7 @@
> warning_at (input_location, OPT_Wcoverage_mismatch,
> "The control flow of function %qE does not match "
> "its profile data (counter %qs)", id, ctr_names[counter]);
> - if (warning_printed)
> + if (flag_profile_use_verbose && warning_printed)
> {
> inform (input_location, "Use -Wno-error=coverage-mismatch to tolerate "
> "the mismatch but performance may drop if the function is hot");
> @@ -727,7 +746,8 @@
> }
> else if (entry->lineno_checksum != lineno_checksum)
> {
> - warning (0, "Source location for function %qE have changed,"
> + warning (OPT_Wcoverage_mismatch,
> + "Source location for function %qE have changed,"
> " the profile data may be out of date",
> DECL_ASSEMBLER_NAME (current_function_decl));
> }
> Index: gcc/common.opt
> ===================================================================
> --- gcc/common.opt (revision 180106)
> +++ gcc/common.opt (working copy)
> @@ -1697,6 +1697,10 @@
> Common Joined RejectNegative
> Enable common options for performing profile feedback directed optimizations, and set -fprofile-dir=
>
> +fprofile-use-verbose
> +Common Report Var(flag_profile_use_verbose)
> +Enable verbose informational messages for FDO use compilation
> +
> fprofile-values
> Common Report Var(flag_profile_values)
> Insert code to profile values of expressions
> Index: gcc/tree-profile.c
> ===================================================================
> --- gcc/tree-profile.c (revision 180106)
> +++ gcc/tree-profile.c (working copy)
> @@ -1096,13 +1096,16 @@
> reusedist_make_instr_call (stmt, subst, counters),
> GSI_NEW_STMT);
>
> - locus = (stmt != NULL)
> - ? gimple_location (stmt)
> - : DECL_SOURCE_LOCATION (current_function_decl);
> - inform (locus,
> - "inserted reuse distance instrumentation for %qs, using "
> - "%d gcov counters", subst->original_name,
> - subst->num_ptr_args * RD_NUM_COUNTERS);
> + if (flag_profile_use_verbose)
> + {
> + locus = (stmt != NULL)
> + ? gimple_location (stmt)
> + : DECL_SOURCE_LOCATION (current_function_decl);
> + inform (locus,
> + "inserted reuse distance instrumentation for %qs, using "
> + "%d gcov counters", subst->original_name,
> + subst->num_ptr_args * RD_NUM_COUNTERS);
> + }
> }
> }
> }
> @@ -1214,7 +1217,7 @@
>
> reusedist_from_counters (counters, &rd);
>
> - if (rd.count)
> + if (flag_profile_use_verbose && rd.count)
> inform (locus, "reuse distance counters for arg %d: %lld %lld %lld %lld",
> arg, (long long int)rd.mean_dist, (long long int)rd.mean_size,
> (long long int)rd.count, (long long int)rd.dist_x_size);
> @@ -1283,9 +1286,10 @@
> subst_decl = reusedist_get_nt_decl (gimple_call_fndecl (stmt), subst,
> suffix);
> gimple_call_set_fndecl (stmt, subst_decl);
> - inform (locus, "replaced %qs with non-temporal %qs",
> - subst->original_name,
> - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (subst_decl)));
> + if (flag_profile_use_verbose)
> + inform (locus, "replaced %qs with non-temporal %qs",
> + subst->original_name,
> + IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (subst_decl)));
> }
>
> /* Replace string operations with equivalent nontemporal, when profitable. */
> @@ -1323,11 +1327,13 @@
>
> if (counter_index != n_counters)
> {
> - warning (0, "coverage mismatch for reuse distance counters "
> + warning (OPT_Wcoverage_mismatch,
> + "coverage mismatch for reuse distance counters "
> "in function %qs", IDENTIFIER_POINTER
> (DECL_ASSEMBLER_NAME (current_function_decl)));
> - inform (input_location, "number of counters is %u instead of %u",
> - n_counters, counter_index);
> + if (flag_profile_use_verbose)
> + inform (input_location, "number of counters is %u instead of %u",
> + n_counters, counter_index);
> }
> }
>
>
> --
> This patch is available for review at http://codereview.appspot.com/5294043
>
More information about the Gcc-patches
mailing list