This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [GOOGLE] Port remaining -fopt-info messages from google/4_7 (plus dump infrastructure enhancement)


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  <tejohnson@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 <tejohnson@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 <davidxl@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 <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
>
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413



-- 
Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]