This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [GOOGLE] Port remaining -fopt-info messages from google/4_7 (plus dump infrastructure enhancement)
- From: Xinliang David Li <davidxl at google dot com>
- To: Teresa Johnson <tejohnson at google dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 26 Jul 2013 10:05:09 -0700
- Subject: Re: [GOOGLE] Port remaining -fopt-info messages from google/4_7 (plus dump infrastructure enhancement)
- References: <CAAe5K+V6wJYEhwM9_pP6NsBj26rfoAA0e8weNzf8q-VumsxC9g at mail dot gmail dot com>
Ok for google branches. Many changes in coverage.c (such as
get_coverage_counts) and value-prof.c need to be in trunk too.
David
On Thu, Jul 25, 2013 at 10:02 AM, Teresa Johnson <tejohnson@google.com> wrote:
> This patch ports the remaining -fopt-info messages that had been added
> to google/gcc-4_7 using the original -fopt-info framework implemented
> on that branch, to google/gcc-4_8 using the new -fopt-info framework
> from trunk.
>
> Specifically, this ports over the messages added/modified by r180269,
> r180973 and r195968. Some of these patches/messages were already ported,
> but this adds the remainder. I converted from the old OPT_INFO_* levels
> to the new MSG_* levels using the following mapping:
> OPT_INFO_MIN -> MSG_OPTIMIZED_LOCATIONS
> OPT_INFO_MED -> MSG_MISSED_OPTIMIZATION
> OPT_INFO_MAX -> MSG_NOTE
> The affected messages relate to LIPO module imports, missing/mismatched/
> corrupted profile data, and indirect call promotions performed.
>
> Additionally, after discussing with Easwaran and Rong, I flipped the
> default of the inline-dump-module-id parameter to 1 to enable dumping
> module ids in -fopt-info inlining messages for easier inlining
> report generation.
>
> Finally, I had to make a couple enhancements to the new dump infrastructure
> to get some of the new messages emitted. This change should be
> pushed to trunk as it will help facilitate adding new dump messages
> more easily (particularly number 2 below). There were two issues:
> 1) The module imports occurred during coverage_init which happens
> very early, before entering the pass manager that sets up the dumping.
> This was addressed by enabling dumping within coverage_init, and
> is modeled on how dumping is enabled after the pass manager
> during finish_optimization_passes.
> 2) Dumping was only enabled for passes marked with an optinfo_flag
> that isn't OPTGROUP_NONE. Currently optgroup flags are only setup for
> optimization groups in the categories IPA, LOOP, INLINE and VEC.
> What this means is that any dump messages added to a pass that isn't
> in one of these groups will silently be suppressed. The OPTGROUP
> setting is specified in opt_pass struct, and is also automatically set
> to OPTGROUP_IPA for any pass starting with "ipa-". What I did was
> to add a new optgroup macro, OPTGROUP_OTHER. This is enabled only
> under -fopt-info-optall, which is also the default for -fopt-info.
> That way dump messages can be emitted without the requirement that
> the pass be part of a group that can be emitted under a specific
> optimization group subset. When setting up the dumps, any pass that
> has OPTGROUP_NONE after examining the opt_pass struct and the pass
> name will use OPTGROUP_OTHER. This doesn't mean that the list of
> optgroups shouldn't be expanded, but rather adds a catch-all for
> passes that don't currently have or need to be emitted on their own
> as part of a new optgroup.
>
> Bootstrapped and regression tested. Ok for google/4_8? (Attached patch
> as a file also since pasting below messed up the whitespace
> formatting.)
>
> Thanks,
> Teresa
>
> 2013-07-25 Teresa Johnson <tejohnson@google.com>
>
> * c-family/c-opts.c (lipo_max_mem_reached): Use new dump framework.
> * profile.c (read_profile_edge_counts): Ditto.
> (compute_branch_probabilities): Ditto.
> * value-prof.c (check_counter): Ditto.
> (check_ic_counter): Ditto.
> (find_func_by_funcdef_no): Ditto.
> (check_ic_target): Ditto.
> (gimple_ic_transform_mult_targ): Ditto.
> * mcf.c (find_minimum_cost_flow): Ditto.
> * coverage.c (incompatible_cl_args): Ditto.
> (read_counts_file): Ditto.
> (get_coverage_counts): Ditto.
> (coverage_init): Setup new dump framework.
> * common.opt (flag_ripa_verbose): Remove.
> * params.def (PARAM_INLINE_DUMP_MODULE_ID): Enable by default.
> * dumpfile.h (OPTGROUP_OTHER): Add and enable under OPTGROUP_ALL.
> * passes.c (register_one_dump_file): Use OPTGROUP_OTHER
> when pass not in any opt group.
> * doc/invoke.texi: Document optall -fopt-info flag.
>
> * testsuite/gcc.dg/pr32773.c: Use -fopt-info.
> * testsuite/gcc.dg/pr40209.c: Ditto.
> * testsuite/gcc.dg/pr26570.c: Ditto.
> * testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c: Ditto.
> * testsuite/g++.dg/tree-ssa/dom-invalid.C: Ditto.
>
> Index: coverage.c
> ===================================================================
> --- coverage.c (revision 200845)
> +++ coverage.c (working copy)
> @@ -48,6 +48,7 @@ along with GCC; see the file COPYING3. If not see
> #include "opts.h"
> #include "gcov-io.h"
> #include "tree-flow.h"
> +#include "tree-pass.h"
> #include "cpplib.h"
> #include "incpath.h"
> #include "diagnostic-core.h"
> @@ -411,14 +412,18 @@ incompatible_cl_args (struct gcov_module_info* mod
> warning (OPT_Wripa_opt_mismatch, "command line arguments mismatch for %s "
> "and %s", mod_info1->source_filename, mod_info2->source_filename);
>
> - if (warn_ripa_opt_mismatch && non_warning_mismatch && flag_ripa_verbose)
> + if (warn_ripa_opt_mismatch && non_warning_mismatch && dump_enabled_p ())
> {
> - inform (UNKNOWN_LOCATION, "Options for %s", mod_info1->source_filename);
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, UNKNOWN_LOCATION,
> + "Options for %s", mod_info1->source_filename);
> for (i = 0; i < num_non_warning_opts1; i++)
> - inform (UNKNOWN_LOCATION, non_warning_opts1[i]);
> - inform (UNKNOWN_LOCATION, "Options for %s", mod_info2->source_filename);
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, UNKNOWN_LOCATION,
> + non_warning_opts1[i]);
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, UNKNOWN_LOCATION,
> + "Options for %s", mod_info2->source_filename);
> for (i = 0; i < num_non_warning_opts2; i++)
> - inform (UNKNOWN_LOCATION, non_warning_opts2[i]);
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, UNKNOWN_LOCATION,
> + non_warning_opts2[i]);
> }
>
> has_any_incompatible_cg_opts
> @@ -835,30 +840,57 @@ read_counts_file (const char *da_file_name, unsign
> 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);
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, 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);
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, 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 reordering is specified, delay the cutoff
> until after sorting. */
> && !getenv ("LIPO_REORDER_GROUP"))
> - inform (input_location, "Not importing %s: maximum group size"
> - " reached", mod_info->source_filename);
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, 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);
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, 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);
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, 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);
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + "Not importing %s: contains assembler"
> + " statements", mod_info->source_filename);
> + }
> else if (mod_info->is_primary == false
> && MODULE_EXPORTED_FLAG (mod_info) == false)
> {
> @@ -884,16 +916,17 @@ read_counts_file (const char *da_file_name, unsign
> record_module_name (mod_info->ident,
> lbasename (mod_info->source_filename));
>
> - if (flag_ripa_verbose)
> + if (dump_enabled_p ())
> {
> - inform (input_location,
> - "MODULE Id=%d, Is_Primary=%s,"
> - " Is_Exported=%s, Include_all=%s, Name=%s (%s)",
> - mod_info->ident, mod_info->is_primary?"yes":"no",
> - MODULE_EXPORTED_FLAG (mod_info)?"yes":"no",
> - MODULE_INCLUDE_ALL_AUX_FLAG (mod_info)?"yes":"no",
> - mod_info->source_filename,
> - mod_info->da_filename);
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + "MODULE Id=%d, Is_Primary=%s,"
> + " Is_Exported=%s, Include_all=%s, Name=%s (%s)",
> + mod_info->ident,
> mod_info->is_primary?"yes":"no",
> + MODULE_EXPORTED_FLAG (mod_info)?"yes":"no",
> + MODULE_INCLUDE_ALL_AUX_FLAG (mod_info)?"yes"
> + :"no",
> + mod_info->source_filename,
> + mod_info->da_filename);
> }
> }
> gcov_sync (offset, length);
> @@ -958,11 +991,13 @@ get_coverage_counts (unsigned counter, unsigned ex
> {
> static int warned = 0;
>
> - if (!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"),
> - da_file_name);
> + if (!warned++ && dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + (flag_guess_branch_prob
> + ? "file %s not found, execution counts estimated"
> + : "file %s not found, execution counts assumed to "
> + "be zero"),
> + da_file_name);
> return NULL;
> }
>
> @@ -970,9 +1005,11 @@ get_coverage_counts (unsigned counter, unsigned ex
>
> if (!entry || !entry->summary.num)
> {
> - if (!flag_dyn_ipa && 0 /*TODO reenable with opt-info */)
> - warning (0, "no coverage for function %qE found",
> - DECL_ASSEMBLER_NAME (current_function_decl));
> + if (!flag_dyn_ipa && dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + "no coverage for function %s found",
> + IDENTIFIER_POINTER
> + (DECL_ASSEMBLER_NAME (current_function_decl)));
> return NULL;
> }
>
> @@ -987,21 +1024,25 @@ get_coverage_counts (unsigned counter, unsigned ex
> 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 (warning_printed && dump_enabled_p ())
> {
> - inform (input_location, "use -Wno-error=coverage-mismatch to tolerate "
> - "the mismatch but performance may drop if the
> function is hot");
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + "use -Wno-error=coverage-mismatch to tolerate "
> + "the mismatch but performance may drop if the "
> + "function is hot");
>
> if (!seen_error ()
> && !warned++)
> {
> - inform (input_location, "coverage mismatch ignored");
> - inform (input_location, flag_guess_branch_prob
> - ? G_("execution counts estimated")
> - : G_("execution counts assumed to be zero"));
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + "coverage mismatch ignored");
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + flag_guess_branch_prob
> + ? G_("execution counts estimated")
> + : G_("execution counts assumed to be zero"));
> if (!flag_guess_branch_prob)
> - inform (input_location,
> - "this can result in poorly optimized code");
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + "this can result in poorly optimized code");
> }
> }
>
> @@ -1009,7 +1050,8 @@ get_coverage_counts (unsigned counter, unsigned ex
> }
> else if (entry->lineno_checksum != lineno_checksum)
> {
> - warning (0, "Source location for function %qE have changed,"
> + warning (OPT_Wripa_opt_mismatch,
> + "Source location for function %qE have changed,"
> " the profile data may be out of date",
> DECL_ASSEMBLER_NAME (current_function_decl));
> }
> @@ -2522,6 +2564,11 @@ coverage_init (const char *filename, const char* s
> int src_name_prefix_len = 0;
> int len = strlen (filename);
>
> + /* Since coverage_init is invoked very early, before the pass
> + manager, we need to set up the dumping explicitly. This is
> + similar to the handling in finish_optimization_passes. */
> + dump_start (pass_profile.pass.static_pass_number, NULL);
> +
> has_asm_statement = false;
> da_file_name = get_da_file_name (filename);
> da_base_file_name = XNEWVEC (char, strlen (filename) + 1);
> @@ -2586,6 +2633,8 @@ coverage_init (const char *filename, const char* s
> gcov_write_unsigned (bbg_file_stamp);
> }
> }
> +
> + dump_finish (pass_profile.pass.static_pass_number);
> }
>
> /* Return True if any type of profiling is enabled which requires linking
> Index: common.opt
> ===================================================================
> --- common.opt (revision 200845)
> +++ common.opt (working copy)
> @@ -1172,10 +1172,6 @@ fripa-inc-path-sub=
> Common Joined RejectNegative Var(lipo_inc_path_pattern)
> Substitute substring in include paths with a new string to allow
> reuse profile data
>
> -fripa-verbose
> -Common Report Var(flag_ripa_verbose)
> -Enable verbose informational messages for LIPO compilation
> -
> fearly-inlining
> Common Report Var(flag_early_inlining) Init(1) Optimization
> Perform early inlining
> Index: testsuite/gcc.dg/pr32773.c
> ===================================================================
> --- testsuite/gcc.dg/pr32773.c (revision 200845)
> +++ 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 -fopt-info" } */
> +/* { dg-options "-O -m4 -fprofile-use -fopt-info" { target sh-*-* } } */
>
> void foo (int *p)
> {
> Index: testsuite/gcc.dg/pr40209.c
> ===================================================================
> --- testsuite/gcc.dg/pr40209.c (revision 200845)
> +++ testsuite/gcc.dg/pr40209.c (working copy)
> @@ -1,5 +1,5 @@
> /* { dg-do compile } */
> -/* { dg-options "-O2 -fprofile-use" } */
> +/* { dg-options "-O2 -fprofile-use -fopt-info" } */
>
> void process(const char *s);
>
> Index: testsuite/gcc.dg/pr26570.c
> ===================================================================
> --- testsuite/gcc.dg/pr26570.c (revision 200845)
> +++ 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 -fopt-info" } */
>
> unsigned test (unsigned a, unsigned b)
> {
> Index: testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c
> ===================================================================
> --- testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c (revision 200845)
> +++ testsuite/gcc.dg/tree-prof/lipo/lipo_inline1_0.c (working copy)
> @@ -1,4 +1,4 @@
> -/* { dg-options "-O2 -fdump-tree-optimized-details-blocks
> -fdump-ipa-inline-details -fripa-verbose" } */
> +/* { dg-options "-O2 -fdump-tree-optimized-details-blocks
> -fdump-ipa-inline-details -fopt-info" } */
>
> extern int foo (void);
> extern int goo (void);
> Index: testsuite/g++.dg/tree-ssa/dom-invalid.C
> ===================================================================
> --- testsuite/g++.dg/tree-ssa/dom-invalid.C (revision 200845)
> +++ 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 -fopt-info
> -fno-rtti" }
>
> struct C
> {
> Index: passes.c
> ===================================================================
> --- passes.c (revision 200845)
> +++ passes.c (working copy)
> @@ -539,6 +539,11 @@ register_one_dump_file (struct opt_pass *pass)
> flag_name = concat (prefix, name, num, NULL);
> glob_name = concat (prefix, name, NULL);
> optgroup_flags |= pass->optinfo_flags;
> + /* For any passes that do not have an optgroup set, and which are not
> + IPA passes setup above, set the optgroup to OPTGROUP_OTHER so that
> + any dump messages are emitted properly under -fopt-info(-optall). */
> + if (optgroup_flags == OPTGROUP_NONE)
> + optgroup_flags = OPTGROUP_OTHER;
> id = dump_register (dot_name, flag_name, glob_name, flags, optgroup_flags);
> set_pass_for_id (id, pass);
> full_name = concat (prefix, pass->name, num, NULL);
> Index: params.def
> ===================================================================
> --- params.def (revision 200847)
> +++ params.def (working copy)
> @@ -996,8 +996,8 @@ DEFPARAM (PARAM_LIPO_WEAK_INCLUSION,
> in inline message. */
> DEFPARAM (PARAM_INLINE_DUMP_MODULE_ID,
> "inline-dump-module-id",
> - "Default is 0. If the value is 1, dumping is enabled.",
> - 0, 0, 1)
> + "Default is 1. If the value is 0, dumping is disabled.",
> + 1, 0, 1)
>
> /* In LIPO profile-gen, use this parameter to enable cgraph dumping. */
> DEFPARAM (PARAM_LIPO_DUMP_CGRAPH,
> Index: c-family/c-opts.c
> ===================================================================
> --- c-family/c-opts.c (revision 200845)
> +++ c-family/c-opts.c (working copy)
> @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3. If not see
> #include "function.h"
> #include "params.h"
> #include "l-ipo.h"
> +#include "dumpfile.h"
>
> #ifndef DOLLARS_IN_IDENTIFIERS
> # define DOLLARS_IN_IDENTIFIERS true
> @@ -1057,12 +1058,16 @@ lipo_max_mem_reached (unsigned int i)
> by the optimizer. */
> && ((ggc_total_allocated () >> 10) * 1.25
> > (size_t) PARAM_VALUE (PARAM_MAX_LIPO_MEMORY))) {
> - i++;
> - do {
> - inform (input_location, "Not importing %s: maximum memory "
> - "consumption reached", in_fnames[i]);
> - i++;
> - } while (i < num_in_fnames);
> + if (dump_enabled_p ())
> + {
> + i++;
> + do {
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, input_location,
> + "Not importing %s: maximum memory "
> + "consumption reached", in_fnames[i]);
> + i++;
> + } while (i < num_in_fnames);
> + }
> return true;
> }
> return false;
> Index: profile.c
> ===================================================================
> --- profile.c (revision 200845)
> +++ profile.c (working copy)
> @@ -545,8 +545,8 @@ read_profile_edge_counts (gcov_type *exec_counts)
> if (flag_profile_correction)
> {
> static bool informed = 0;
> - if (!informed)
> - inform (input_location,
> + if (dump_enabled_p () && !informed)
> + dump_printf_loc (MSG_NOTE, input_location,
> "corrupted profile info: edge count
> exceeds maximal count");
> informed = 1;
> }
> @@ -805,10 +805,11 @@ compute_branch_probabilities (unsigned cfg_checksu
> {
> /* Inconsistency detected. Make it flow-consistent. */
> static int informed = 0;
> - if (informed == 0)
> + if (dump_enabled_p () && informed == 0)
> {
> informed = 1;
> - inform (input_location, "correcting inconsistent profile data");
> + dump_printf_loc (MSG_NOTE, input_location,
> + "correcting inconsistent profile data");
> }
> correct_negative_edge_counts ();
> /* Set bb counts to the sum of the outgoing edge counts */
> Index: dumpfile.h
> ===================================================================
> --- dumpfile.h (revision 200845)
> +++ dumpfile.h (working copy)
> @@ -97,8 +97,9 @@ enum tree_dump_index
> #define OPTGROUP_LOOP (1 << 2) /* Loop optimization passes */
> #define OPTGROUP_INLINE (1 << 3) /* Inlining passes */
> #define OPTGROUP_VEC (1 << 4) /* Vectorization passes */
> +#define OPTGROUP_OTHER (1 << 5) /* All other passes */
> #define OPTGROUP_ALL (OPTGROUP_IPA | OPTGROUP_LOOP | OPTGROUP_INLINE \
> - | OPTGROUP_VEC)
> + | OPTGROUP_VEC | OPTGROUP_OTHER)
>
> /* Define a tree dump switch. */
> struct dump_file_info
> Index: value-prof.c
> ===================================================================
> --- value-prof.c (revision 200845)
> +++ value-prof.c (working copy)
> @@ -504,9 +504,11 @@ check_counter (gimple stmt, const char * name,
> : 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 (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, 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;
> @@ -540,35 +542,35 @@ check_ic_counter (gimple stmt, gcov_type *count1,
> gcov_type all)
> {
> location_t locus;
> + locus = (stmt != NULL)
> + ? gimple_location (stmt)
> + : DECL_SOURCE_LOCATION (current_function_decl);
> 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 (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, 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 (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, 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 (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
> + "Corrupted topn ic value profile: "
> + "first target count (%ld) is less than the second "
> + "target count (%ld)", (long)*count1, (long)*count2);
> return true;
> }
>
> @@ -580,12 +582,12 @@ check_ic_counter (gimple stmt, gcov_type *count1,
> *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 (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
> + "Corrupted topn ic value profile: top two "
> + "targets's total count (%ld) exceeds bb count "
> + "(%ld)",
> + (long)(*count1 + *count2), (long)all);
> return true;
> }
> }
> @@ -1196,9 +1198,11 @@ find_func_by_funcdef_no (int func_id)
> int max_id = get_last_funcdef_no ();
> if (func_id >= max_id || cgraph_node_map[func_id] == NULL)
> {
> - if (flag_profile_correction)
> - inform (DECL_SOURCE_LOCATION (current_function_decl),
> - "Inconsistent profile: indirect call target (%d) does
> not exist", func_id);
> + if (flag_profile_correction && dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION,
> + 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);
>
> @@ -1331,8 +1335,10 @@ check_ic_target (gimple call_stmt, struct cgraph_n
> return true;
>
> locus = gimple_location (call_stmt);
> - inform (locus, "Skipping target %s with mismatching types for icall ",
> - cgraph_node_name (target));
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
> + "Skipping target %s with mismatching types for icall ",
> + cgraph_node_name (target));
> return false;
> }
>
> @@ -1600,19 +1606,23 @@ gimple_ic_transform_mult_targ (gimple stmt, histog
> if (direct_call1 == NULL
> || !check_ic_target (stmt, direct_call1))
> {
> - if (flag_ripa_verbose && !flag_auto_profile)
> + if (dump_enabled_p () && !flag_auto_profile)
> {
> if (!direct_call1)
> - inform (locus, "Can not find indirect call target decl "
> - "(%d:%d)[cnt:%u] in current module",
> - EXTRACT_MODULE_ID_FROM_GLOBAL_ID (val1),
> - EXTRACT_FUNC_ID_FROM_GLOBAL_ID (val1), (unsigned) count1);
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
> + "Can not find indirect call target decl "
> + "(%d:%d)[cnt:%u] in current module",
> + EXTRACT_MODULE_ID_FROM_GLOBAL_ID (val1),
> + EXTRACT_FUNC_ID_FROM_GLOBAL_ID (val1),
> + (unsigned) count1);
> else
> - inform (locus,
> - "Can not find promote indirect call target decl
> -- type mismatch "
> - "(%d:%d)[cnt:%u] in current module",
> - EXTRACT_MODULE_ID_FROM_GLOBAL_ID (val1),
> - EXTRACT_FUNC_ID_FROM_GLOBAL_ID (val1), (unsigned) count1);
> + dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
> + "Can not find promote indirect call target decl "
> + "-- type mismatch (%d:%d)[cnt:%u] in current "
> + "module",
> + EXTRACT_MODULE_ID_FROM_GLOBAL_ID (val1),
> + EXTRACT_FUNC_ID_FROM_GLOBAL_ID (val1),
> + (unsigned) count1);
> }
> return false;
> }
> @@ -1626,10 +1636,12 @@ gimple_ic_transform_mult_targ (gimple stmt, histog
> return false;
>
> modify1 = gimple_ic (stmt, direct_call1, prob1, count1, all);
> - if (flag_ripa_verbose)
> - inform (locus, "Promote indirect call to target (call count:%u) %s",
> - (unsigned) count1,
> - lang_hooks.decl_printable_name (direct_call1->symbol.decl, 3));
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus,
> + "Promote indirect call to target (call count:%u) %s",
> + (unsigned) count1,
> + lang_hooks.decl_printable_name
> (direct_call1->symbol.decl,
> + 3));
>
> if (always_inline && count1 >= always_inline)
> {
> @@ -1667,10 +1679,12 @@ gimple_ic_transform_mult_targ (gimple stmt, histog
> modify2 = gimple_ic (stmt, direct_call2,
> prob2, count2, all - count1);
>
> - if (flag_ripa_verbose)
> - inform (locus, "Promote indirect call to target (call count:%u) %s",
> - (unsigned) count2,
> - lang_hooks.decl_printable_name (direct_call2->symbol.decl, 3));
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, locus,
> + "Promote indirect call to target (call count:%u) %s",
> + (unsigned) count2,
> + lang_hooks.decl_printable_name (
> + direct_call2->symbol.decl, 3));
>
> if (always_inline && count2 >= always_inline)
> {
> Index: doc/invoke.texi
> ===================================================================
> --- doc/invoke.texi (revision 200845)
> +++ doc/invoke.texi (working copy)
> @@ -6285,6 +6285,9 @@ Enable dumps from all loop optimizations.
> Enable dumps from all inlining optimizations.
> @item vec
> Enable dumps from all vectorization optimizations.
> +@item optall
> +Enable dumps from all optimizations. This is a superset of
> +the optimization groups listed above.
> @end table
>
> For example,
> Index: mcf.c
> ===================================================================
> --- mcf.c (revision 200845)
> +++ mcf.c (working copy)
> @@ -1437,10 +1437,12 @@ find_minimum_cost_flow (fixup_graph_type *fixup_gr
> if (iteration > MAX_ITER (fixup_graph->num_vertices,
> fixup_graph->num_edges))
> {
> - inform (DECL_SOURCE_LOCATION (current_function_decl),
> - "Exiting profile correction early to avoid excessive "
> - "compile time");
> - break;
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_NOTE,
> + DECL_SOURCE_LOCATION (current_function_decl),
> + "Exiting profile correction early to avoid "
> + "excessive compile time");
> + break;
> }
> }
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413