is it better to hoist the newline dump before all the branches?

David

On Fri, Jul 26, 2013 at 1:06 PM, Teresa Johnson <tejohn...@google.com> wrote:
> After converting so many more messages to the new dump framework with my
> previous change, I noticed a bug where the dumper was not always starting
> a dump message on a new line. The issue is that the dump framework does
> not always emit the source position info, but that was where the new line
> was being emitted. Fix below to emit new line even when not emitting the
> source position info. I will include it in the patch I send to trunk.
>
> Passes gcc regression tests. Ok for google branches?
>
> 2013-07-26  Teresa Johnson  <tejohn...@google.com>
>
>         * dumpfile.c (dump_loc): Ensure newline emitted.
>
> Index: dumpfile.c
> ===================================================================
> --- dumpfile.c  (revision 201268)
> +++ dumpfile.c  (working copy)
> @@ -269,6 +269,8 @@ dump_loc (int dump_kind, FILE *dfile, source_locat
>                   DECL_SOURCE_LINE (current_function_decl),
>                   DECL_SOURCE_COLUMN (current_function_decl));
>      }
> +  else
> +    fprintf (dfile, "\n");
>  }
>
>  /* Dump gimple statement GS with SPC indentation spaces and
>
> On Fri, Jul 26, 2013 at 10:18 AM, Teresa Johnson <tejohn...@google.com> wrote:
>> Thanks. I'll work on a trunk patch to send next week. Teresa
>>
>> On Fri, Jul 26, 2013 at 10:05 AM, Xinliang David Li <davi...@google.com> 
>> wrote:
>>> 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 <tejohn...@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  <tejohn...@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 | tejohn...@google.com | 408-460-2413
>>
>>
>>
>> --
>> Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413
>
>
>
> --
> Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413

Reply via email to