[4/4] ipa-inline.c/tree-inline.c: port from fprintf to dump API (PR ipa/86395)

Message ID 1541610522-56777-5-git-send-email-dmalcolm@redhat.com
State New
Headers show
Series
  • Fix -fopt-info-inline (PR ipa/86395)
Related show

Commit Message

David Malcolm Nov. 7, 2018, 5:08 p.m.
This patch ports various fprintf calls in the inlining code to using
the dump API, using the %C format code for printing cgraph_node *.
I focused on the dump messages that seemed most significant to
end-users; I didn't port all of the calls.

Doing so makes this information appear in -fopt-info and in
optimization records, rather than just in the dump_file.

It also changes the affected dumpfile-dumps from being unconditional
(assuming the dump_file is enabled) to being guarded by the MSG_*
status.  Hence various tests with dg-final scan-*-dump directives
need to gain "-all" or "-optimized" suffixes to -fdump-ipa-inline.

The use of %C throughout also slightly changes the dump format for
several messages, e.g. changing:

 Inlining void inline_me(char*) into int main(int, char**).

to:

../../src/gcc/testsuite/g++.dg/tree-ssa/inline-1.C:13:8: optimized:  Inlining void inline_me(char*)/0 into int main(int, char**)/2.

amongst other things adding "/order" suffixes to the cgraph node
names.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu, in
conjunction with the rest of the patch kit.

OK for trunk?

gcc/ChangeLog:
	PR ipa/86395
	* doc/invoke.texi (-fdump-ipa-): Document the "-optimized",
	"-missed", "-note", and "-all" sub-options.
	* ipa-inline.c (caller_growth_limits): Port from fprintf to dump
	API.
	(can_early_inline_edge_p): Likewise.
	(want_early_inline_function_p): Likewise.
	(want_inline_self_recursive_call_p): Likewise.
	(recursive_inlining): Likewise.
	(inline_small_functions): Likewise.
	(flatten_function): Likewise.
	(ipa_inline): Likewise.
	(inline_always_inline_functions): Likewise.
	(early_inline_small_functions): Likewise.
	(early_inliner): Likewise.
	* tree-inline.c (expand_call_inline): Likewise.

gcc/testsuite/ChangeLog:
	PR ipa/86395
	* g++.dg/ipa/devirt-12.C: Add "-all" suffix to
	"-fdump-ipa-inline".
	* g++.dg/ipa/imm-devirt-1.C: Add "-optimized" suffix to
	"-fdump-tree-einline".
	* g++.dg/tree-prof/inline_mismatch_args.C: Add "-all" suffix to
	"-fdump-tree-einline".
	* g++.dg/tree-ssa/inline-1.C: Add "-optimized" suffix to
	"-fdump-tree-einline".
	* g++.dg/tree-ssa/inline-2.C: Likewise.
	* g++.dg/tree-ssa/inline-3.C: Likewise.
	* g++.dg/tree-ssa/inline-4.C: New test, based on inline-1.C, but
	using "-fopt-info-inline".
	* gcc.dg/ipa/fopt-info-inline-1.c: New test.
	* gcc.dg/ipa/inline-4.c:  Add "-all" suffix to
	"-fdump-ipa-inline".  Add "-fopt-info-inline" and dg-optimized
	directive.
	* gcc.dg/ipa/inline-7.c: Add "-optimized" suffix to
	"-fdump-tree-einline".  Add "-fopt-info-inline" and dg-optimized
	directive.  Update scan-tree-dump-times to reflect /order
	suffixes.
	* gcc.dg/ipa/inlinehint-4.c: Update scan-tree-dump-times to
	reflect /order suffixes.
	* gcc.dg/plugin/dump-1.c: Add "-loop" to "-fopt-info-note" to
	avoid getting extra messages from inliner.
	* gcc.dg/plugin/dump-2.c: Likewise.
	* gcc.dg/pr26570.c: Add dg-prune-output to ignore new
	"function body not available" missed optimization messages.
	* gcc.dg/pr71969-2.c: Update scan-tree-dump-times to reflect
	/order suffixes.
	* gcc.dg/pr71969-3.c: Likewise.
	* gcc.dg/tree-ssa/inline-11.c: Add "-all" suffix to
	"-fdump-tree-einline".
	* gcc.dg/tree-ssa/inline-3.c: Add "-optimized" suffix to
	"-fdump-tree-einline".  Update scan-tree-dump-times to reflect
	/order suffixes.
	* gcc.dg/tree-ssa/inline-4.c: Add "-optimized" suffix to
	"-fdump-tree-einline".  Add "-fopt-info-inline" and dg-optimized
	directive.
	* gcc.dg/tree-ssa/inline-8.c: Add "-optimized" suffix to
	"-fdump-tree-einline".
	* gfortran.dg/pr79966.f90: Update scan-ipa-dump to reflect /order
	suffixes.
---
 gcc/doc/invoke.texi                                |  13 ++
 gcc/ipa-inline.c                                   | 191 +++++++++++----------
 gcc/testsuite/g++.dg/ipa/devirt-12.C               |   2 +-
 gcc/testsuite/g++.dg/ipa/imm-devirt-1.C            |   2 +-
 .../g++.dg/tree-prof/inline_mismatch_args.C        |   2 +-
 gcc/testsuite/g++.dg/tree-ssa/inline-1.C           |   2 +-
 gcc/testsuite/g++.dg/tree-ssa/inline-2.C           |   2 +-
 gcc/testsuite/g++.dg/tree-ssa/inline-3.C           |   2 +-
 gcc/testsuite/g++.dg/tree-ssa/inline-4.C           |  32 ++++
 gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c      |  44 +++++
 gcc/testsuite/gcc.dg/ipa/inline-4.c                |   4 +-
 gcc/testsuite/gcc.dg/ipa/inline-7.c                |   6 +-
 gcc/testsuite/gcc.dg/ipa/inlinehint-4.c            |   4 +-
 gcc/testsuite/gcc.dg/plugin/dump-1.c               |   2 +-
 gcc/testsuite/gcc.dg/plugin/dump-2.c               |   2 +-
 gcc/testsuite/gcc.dg/pr26570.c                     |   1 +
 gcc/testsuite/gcc.dg/pr71969-2.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr71969-3.c                   |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/inline-11.c          |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/inline-3.c           |   6 +-
 gcc/testsuite/gcc.dg/tree-ssa/inline-4.c           |   6 +-
 gcc/testsuite/gcc.dg/tree-ssa/inline-8.c           |   2 +-
 gcc/testsuite/gfortran.dg/pr79966.f90              |   2 +-
 gcc/tree-inline.c                                  |  20 ++-
 24 files changed, 229 insertions(+), 124 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/tree-ssa/inline-4.C
 create mode 100644 gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c

Comments

Richard Biener Nov. 8, 2018, 11:33 a.m. | #1
On Wed, Nov 7, 2018 at 5:22 PM David Malcolm <dmalcolm@redhat.com> wrote:
>
> This patch ports various fprintf calls in the inlining code to using
> the dump API, using the %C format code for printing cgraph_node *.
> I focused on the dump messages that seemed most significant to
> end-users; I didn't port all of the calls.
>
> Doing so makes this information appear in -fopt-info and in
> optimization records, rather than just in the dump_file.
>
> It also changes the affected dumpfile-dumps from being unconditional
> (assuming the dump_file is enabled) to being guarded by the MSG_*
> status.  Hence various tests with dg-final scan-*-dump directives
> need to gain "-all" or "-optimized" suffixes to -fdump-ipa-inline.
>
> The use of %C throughout also slightly changes the dump format for
> several messages, e.g. changing:
>
>  Inlining void inline_me(char*) into int main(int, char**).
>
> to:
>
> ../../src/gcc/testsuite/g++.dg/tree-ssa/inline-1.C:13:8: optimized:  Inlining void inline_me(char*)/0 into int main(int, char**)/2.
>
> amongst other things adding "/order" suffixes to the cgraph node
> names.
>
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu, in
> conjunction with the rest of the patch kit.
>
> OK for trunk?

OK.

Thanks for doing this!
Richard.

> gcc/ChangeLog:
>         PR ipa/86395
>         * doc/invoke.texi (-fdump-ipa-): Document the "-optimized",
>         "-missed", "-note", and "-all" sub-options.
>         * ipa-inline.c (caller_growth_limits): Port from fprintf to dump
>         API.
>         (can_early_inline_edge_p): Likewise.
>         (want_early_inline_function_p): Likewise.
>         (want_inline_self_recursive_call_p): Likewise.
>         (recursive_inlining): Likewise.
>         (inline_small_functions): Likewise.
>         (flatten_function): Likewise.
>         (ipa_inline): Likewise.
>         (inline_always_inline_functions): Likewise.
>         (early_inline_small_functions): Likewise.
>         (early_inliner): Likewise.
>         * tree-inline.c (expand_call_inline): Likewise.
>
> gcc/testsuite/ChangeLog:
>         PR ipa/86395
>         * g++.dg/ipa/devirt-12.C: Add "-all" suffix to
>         "-fdump-ipa-inline".
>         * g++.dg/ipa/imm-devirt-1.C: Add "-optimized" suffix to
>         "-fdump-tree-einline".
>         * g++.dg/tree-prof/inline_mismatch_args.C: Add "-all" suffix to
>         "-fdump-tree-einline".
>         * g++.dg/tree-ssa/inline-1.C: Add "-optimized" suffix to
>         "-fdump-tree-einline".
>         * g++.dg/tree-ssa/inline-2.C: Likewise.
>         * g++.dg/tree-ssa/inline-3.C: Likewise.
>         * g++.dg/tree-ssa/inline-4.C: New test, based on inline-1.C, but
>         using "-fopt-info-inline".
>         * gcc.dg/ipa/fopt-info-inline-1.c: New test.
>         * gcc.dg/ipa/inline-4.c:  Add "-all" suffix to
>         "-fdump-ipa-inline".  Add "-fopt-info-inline" and dg-optimized
>         directive.
>         * gcc.dg/ipa/inline-7.c: Add "-optimized" suffix to
>         "-fdump-tree-einline".  Add "-fopt-info-inline" and dg-optimized
>         directive.  Update scan-tree-dump-times to reflect /order
>         suffixes.
>         * gcc.dg/ipa/inlinehint-4.c: Update scan-tree-dump-times to
>         reflect /order suffixes.
>         * gcc.dg/plugin/dump-1.c: Add "-loop" to "-fopt-info-note" to
>         avoid getting extra messages from inliner.
>         * gcc.dg/plugin/dump-2.c: Likewise.
>         * gcc.dg/pr26570.c: Add dg-prune-output to ignore new
>         "function body not available" missed optimization messages.
>         * gcc.dg/pr71969-2.c: Update scan-tree-dump-times to reflect
>         /order suffixes.
>         * gcc.dg/pr71969-3.c: Likewise.
>         * gcc.dg/tree-ssa/inline-11.c: Add "-all" suffix to
>         "-fdump-tree-einline".
>         * gcc.dg/tree-ssa/inline-3.c: Add "-optimized" suffix to
>         "-fdump-tree-einline".  Update scan-tree-dump-times to reflect
>         /order suffixes.
>         * gcc.dg/tree-ssa/inline-4.c: Add "-optimized" suffix to
>         "-fdump-tree-einline".  Add "-fopt-info-inline" and dg-optimized
>         directive.
>         * gcc.dg/tree-ssa/inline-8.c: Add "-optimized" suffix to
>         "-fdump-tree-einline".
>         * gfortran.dg/pr79966.f90: Update scan-ipa-dump to reflect /order
>         suffixes.
> ---
>  gcc/doc/invoke.texi                                |  13 ++
>  gcc/ipa-inline.c                                   | 191 +++++++++++----------
>  gcc/testsuite/g++.dg/ipa/devirt-12.C               |   2 +-
>  gcc/testsuite/g++.dg/ipa/imm-devirt-1.C            |   2 +-
>  .../g++.dg/tree-prof/inline_mismatch_args.C        |   2 +-
>  gcc/testsuite/g++.dg/tree-ssa/inline-1.C           |   2 +-
>  gcc/testsuite/g++.dg/tree-ssa/inline-2.C           |   2 +-
>  gcc/testsuite/g++.dg/tree-ssa/inline-3.C           |   2 +-
>  gcc/testsuite/g++.dg/tree-ssa/inline-4.C           |  32 ++++
>  gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c      |  44 +++++
>  gcc/testsuite/gcc.dg/ipa/inline-4.c                |   4 +-
>  gcc/testsuite/gcc.dg/ipa/inline-7.c                |   6 +-
>  gcc/testsuite/gcc.dg/ipa/inlinehint-4.c            |   4 +-
>  gcc/testsuite/gcc.dg/plugin/dump-1.c               |   2 +-
>  gcc/testsuite/gcc.dg/plugin/dump-2.c               |   2 +-
>  gcc/testsuite/gcc.dg/pr26570.c                     |   1 +
>  gcc/testsuite/gcc.dg/pr71969-2.c                   |   2 +-
>  gcc/testsuite/gcc.dg/pr71969-3.c                   |   2 +-
>  gcc/testsuite/gcc.dg/tree-ssa/inline-11.c          |   2 +-
>  gcc/testsuite/gcc.dg/tree-ssa/inline-3.c           |   6 +-
>  gcc/testsuite/gcc.dg/tree-ssa/inline-4.c           |   6 +-
>  gcc/testsuite/gcc.dg/tree-ssa/inline-8.c           |   2 +-
>  gcc/testsuite/gfortran.dg/pr79966.f90              |   2 +-
>  gcc/tree-inline.c                                  |  20 ++-
>  24 files changed, 229 insertions(+), 124 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/tree-ssa/inline-4.C
>  create mode 100644 gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
>
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 055e8c4..97de735 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -14062,6 +14062,7 @@ instruction numbers for the links to the previous and next instructions
>  in a sequence.
>
>  @item -fdump-ipa-@var{switch}
> +@itemx -fdump-ipa-@var{switch}-@var{options}
>  @opindex fdump-ipa
>  Control the dumping at various stages of inter-procedural analysis
>  language tree to a file.  The file name is generated by appending a
> @@ -14082,6 +14083,18 @@ Dump after function inlining.
>
>  @end table
>
> +Additionally, the options @option{-optimized}, @option{-missed},
> +@option{-note}, and @option{-all} can be provided, with the same meaning
> +as for @option{-fopt-info}, defaulting to @option{-optimized}.
> +
> +For example, @option{-fdump-ipa-inline-optimized-missed} will emit
> +information on callsites that were inlined, along with callsites
> +that were not inlined.
> +
> +By default, the dump will contain messages about successful
> +optimizations (equivalent to @option {-optimized}) together with
> +low-level details about the analysis.
> +
>  @item -fdump-lang-all
>  @itemx -fdump-lang-@var{switch}
>  @itemx -fdump-lang-@var{switch}-@var{options}
> diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
> index 4f8ed15..8d0762d 100644
> --- a/gcc/ipa-inline.c
> +++ b/gcc/ipa-inline.c
> @@ -227,20 +227,21 @@ caller_growth_limits (struct cgraph_edge *e)
>  static void
>  report_inline_failed_reason (struct cgraph_edge *e)
>  {
> -  if (dump_file)
> +  if (dump_enabled_p ())
>      {
> -      fprintf (dump_file, "  not inlinable: %s -> %s, %s\n",
> -              e->caller->dump_name (),
> -              e->callee->dump_name (),
> -              cgraph_inline_failed_string (e->inline_failed));
> +      dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                      "  not inlinable: %C -> %C, %s\n",
> +                      e->caller, e->callee,
> +                      cgraph_inline_failed_string (e->inline_failed));
>        if ((e->inline_failed == CIF_TARGET_OPTION_MISMATCH
>            || e->inline_failed == CIF_OPTIMIZATION_MISMATCH)
>           && e->caller->lto_file_data
>           && e->callee->ultimate_alias_target ()->lto_file_data)
>         {
> -         fprintf (dump_file, "  LTO objects: %s, %s\n",
> -                  e->caller->lto_file_data->file_name,
> -                  e->callee->ultimate_alias_target ()->lto_file_data->file_name);
> +         dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                          "  LTO objects: %s, %s\n",
> +                          e->caller->lto_file_data->file_name,
> +                          e->callee->ultimate_alias_target ()->lto_file_data->file_name);
>         }
>        if (e->inline_failed == CIF_TARGET_OPTION_MISMATCH)
>         cl_target_option_print_diff
> @@ -569,8 +570,9 @@ can_early_inline_edge_p (struct cgraph_edge *e)
>    if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->decl))
>        || !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
>      {
> -      if (dump_file)
> -       fprintf (dump_file, "  edge not inlinable: not in SSA form\n");
> +      if (dump_enabled_p ())
> +       dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                        "  edge not inlinable: not in SSA form\n");
>        return false;
>      }
>    if (!can_inline_edge_p (e, true, true)
> @@ -630,34 +632,34 @@ want_early_inline_function_p (struct cgraph_edge *e)
>        else if (!e->maybe_hot_p ()
>                && growth > 0)
>         {
> -         if (dump_file)
> -           fprintf (dump_file, "  will not early inline: %s->%s, "
> -                    "call is cold and code would grow by %i\n",
> -                    e->caller->dump_name (),
> -                    callee->dump_name (),
> -                    growth);
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "  will not early inline: %C->%C, "
> +                            "call is cold and code would grow by %i\n",
> +                            e->caller, callee,
> +                            growth);
>           want_inline = false;
>         }
>        else if (growth > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
>         {
> -         if (dump_file)
> -           fprintf (dump_file, "  will not early inline: %s->%s, "
> -                    "growth %i exceeds --param early-inlining-insns\n",
> -                    e->caller->dump_name (),
> -                    callee->dump_name (),
> -                    growth);
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "  will not early inline: %C->%C, "
> +                            "growth %i exceeds --param early-inlining-insns\n",
> +                            e->caller, callee,
> +                            growth);
>           want_inline = false;
>         }
>        else if ((n = num_calls (callee)) != 0
>                && growth * (n + 1) > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
>         {
> -         if (dump_file)
> -           fprintf (dump_file, "  will not early inline: %s->%s, "
> -                    "growth %i exceeds --param early-inlining-insns "
> -                    "divided by number of calls\n",
> -                    e->caller->dump_name (),
> -                    callee->dump_name (),
> -                    growth);
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "  will not early inline: %C->%C, "
> +                            "growth %i exceeds --param early-inlining-insns "
> +                            "divided by number of calls\n",
> +                            e->caller, callee,
> +                            growth);
>           want_inline = false;
>         }
>      }
> @@ -936,8 +938,9 @@ want_inline_self_recursive_call_p (struct cgraph_edge *edge,
>           want_inline = false;
>         }
>      }
> -  if (!want_inline && dump_file)
> -    fprintf (dump_file, "   not inlining recursively: %s\n", reason);
> +  if (!want_inline && dump_enabled_p ())
> +    dump_printf_loc (MSG_MISSED_OPTIMIZATION, edge->call_stmt,
> +                    "   not inlining recursively: %s\n", reason);
>    return want_inline;
>  }
>
> @@ -1562,14 +1565,14 @@ recursive_inlining (struct cgraph_edge *edge,
>    if (!master_clone)
>      return false;
>
> -  if (dump_file)
> -    fprintf (dump_file,
> -            "\n   Inlined %i times, "
> -            "body grown from size %i to %i, time %f to %f\n", n,
> -            ipa_fn_summaries->get (master_clone)->size,
> -            ipa_fn_summaries->get (node)->size,
> -            ipa_fn_summaries->get (master_clone)->time.to_double (),
> -            ipa_fn_summaries->get (node)->time.to_double ());
> +  if (dump_enabled_p ())
> +    dump_printf_loc (MSG_NOTE, edge->call_stmt,
> +                    "\n   Inlined %i times, "
> +                    "body grown from size %i to %i, time %f to %f\n", n,
> +                    ipa_fn_summaries->get (master_clone)->size,
> +                    ipa_fn_summaries->get (node)->size,
> +                    ipa_fn_summaries->get (master_clone)->time.to_double (),
> +                    ipa_fn_summaries->get (node)->time.to_double ());
>
>    /* Remove master clone we used for inlining.  We rely that clones inlined
>       into master clone gets queued just before master clone so we don't
> @@ -2078,17 +2081,20 @@ inline_small_functions (void)
>         update_callee_keys (&edge_heap, n, updated_nodes);
>        bitmap_clear (updated_nodes);
>
> -      if (dump_file)
> +      if (dump_enabled_p ())
>         {
>           ipa_fn_summary *s = ipa_fn_summaries->get (edge->caller);
> -         fprintf (dump_file,
> -                  " Inlined %s into %s which now has time %f and size %i, "
> -                  "net change of %+i.\n",
> -                  xstrdup_for_dump (edge->callee->name ()),
> -                  xstrdup_for_dump (edge->caller->name ()),
> -                  s->time.to_double (),
> -                  s->size,
> -                  overall_size - old_size);
> +
> +         /* dump_printf can't handle %+i.  */
> +         char buf_net_change[100];
> +         snprintf (buf_net_change, sizeof buf_net_change, "%+i",
> +                   overall_size - old_size);
> +
> +         dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, edge->call_stmt,
> +                          " Inlined %C into %C which now has time %f and "
> +                          "size %i, net change of %s.\n",
> +                          edge->callee, edge->caller,
> +                          s->time.to_double (), s->size, buf_net_change);
>         }
>        if (min_size > overall_size)
>         {
> @@ -2101,11 +2107,11 @@ inline_small_functions (void)
>      }
>
>    free_growth_caches ();
> -  if (dump_file)
> -    fprintf (dump_file,
> -            "Unit growth for small function inlining: %i->%i (%i%%)\n",
> -            initial_size, overall_size,
> -            initial_size ? overall_size * 100 / (initial_size) - 100: 0);
> +  if (dump_enabled_p ())
> +    dump_printf (MSG_NOTE,
> +                "Unit growth for small function inlining: %i->%i (%i%%)\n",
> +                initial_size, overall_size,
> +                initial_size ? overall_size * 100 / (initial_size) - 100: 0);
>    symtab->remove_edge_removal_hook (edge_removal_hook_holder);
>  }
>
> @@ -2130,11 +2136,10 @@ flatten_function (struct cgraph_node *node, bool early)
>        /* We've hit cycle?  It is time to give up.  */
>        if (callee->aux)
>         {
> -         if (dump_file)
> -           fprintf (dump_file,
> -                    "Not inlining %s into %s to avoid cycle.\n",
> -                    xstrdup_for_dump (callee->name ()),
> -                    xstrdup_for_dump (e->caller->name ()));
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "Not inlining %C into %C to avoid cycle.\n",
> +                            callee, e->caller);
>           if (cgraph_inline_failed_type (e->inline_failed) != CIF_FINAL_ERROR)
>             e->inline_failed = CIF_RECURSIVE_INLINING;
>           continue;
> @@ -2159,25 +2164,27 @@ flatten_function (struct cgraph_node *node, bool early)
>
>        if (e->recursive_p ())
>         {
> -         if (dump_file)
> -           fprintf (dump_file, "Not inlining: recursive call.\n");
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "Not inlining: recursive call.\n");
>           continue;
>         }
>
>        if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
>           != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
>         {
> -         if (dump_file)
> -           fprintf (dump_file, "Not inlining: SSA form does not match.\n");
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "Not inlining: SSA form does not match.\n");
>           continue;
>         }
>
>        /* Inline the edge and flatten the inline clone.  Avoid
>           recursing through the original node if the node was cloned.  */
> -      if (dump_file)
> -       fprintf (dump_file, " Inlining %s into %s.\n",
> -                xstrdup_for_dump (callee->name ()),
> -                xstrdup_for_dump (e->caller->name ()));
> +      if (dump_enabled_p ())
> +       dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
> +                        " Inlining %C into %C.\n",
> +                        callee, e->caller);
>        orig_callee = callee;
>        inline_call (e, true, NULL, NULL, false);
>        if (e->callee != orig_callee)
> @@ -2589,13 +2596,12 @@ ipa_inline (void)
>    /* Free ipa-prop structures if they are no longer needed.  */
>    ipa_free_all_structures_after_iinln ();
>
> +  if (dump_enabled_p ())
> +    dump_printf (MSG_NOTE,
> +                "\nInlined %i calls, eliminated %i functions\n\n",
> +                ncalls_inlined, nfunctions_inlined);
>    if (dump_file)
> -    {
> -      fprintf (dump_file,
> -              "\nInlined %i calls, eliminated %i functions\n\n",
> -              ncalls_inlined, nfunctions_inlined);
> -      dump_inline_stats ();
> -    }
> +    dump_inline_stats ();
>
>    if (dump_file)
>      ipa_dump_fn_summaries (dump_file);
> @@ -2618,9 +2624,10 @@ inline_always_inline_functions (struct cgraph_node *node)
>
>        if (e->recursive_p ())
>         {
> -         if (dump_file)
> -           fprintf (dump_file, "  Not inlining recursive call to %s.\n",
> -                    e->callee->name ());
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "  Not inlining recursive call to %C.\n",
> +                            e->callee);
>           e->inline_failed = CIF_RECURSIVE_INLINING;
>           continue;
>         }
> @@ -2636,10 +2643,10 @@ inline_always_inline_functions (struct cgraph_node *node)
>           continue;
>         }
>
> -      if (dump_file)
> -       fprintf (dump_file, "  Inlining %s into %s (always_inline).\n",
> -                xstrdup_for_dump (e->callee->name ()),
> -                xstrdup_for_dump (e->caller->name ()));
> +      if (dump_enabled_p ())
> +       dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
> +                        "  Inlining %C into %C (always_inline).\n",
> +                        e->callee, e->caller);
>        inline_call (e, true, NULL, NULL, false);
>        inlined = true;
>      }
> @@ -2675,27 +2682,29 @@ early_inline_small_functions (struct cgraph_node *node)
>           && !opt_for_fn (node->decl, flag_inline_functions))
>         continue;
>
> -      if (dump_file)
> -       fprintf (dump_file, "Considering inline candidate %s.\n",
> -                callee->name ());
> +      if (dump_enabled_p ())
> +       dump_printf_loc (MSG_NOTE, e->call_stmt,
> +                        "Considering inline candidate %C.\n",
> +                        callee);
>
>        if (!can_early_inline_edge_p (e))
>         continue;
>
>        if (e->recursive_p ())
>         {
> -         if (dump_file)
> -           fprintf (dump_file, "  Not inlining: recursive call.\n");
> +         if (dump_enabled_p ())
> +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> +                            "  Not inlining: recursive call.\n");
>           continue;
>         }
>
>        if (!want_early_inline_function_p (e))
>         continue;
>
> -      if (dump_file)
> -       fprintf (dump_file, " Inlining %s into %s.\n",
> -                xstrdup_for_dump (callee->name ()),
> -                xstrdup_for_dump (e->caller->name ()));
> +      if (dump_enabled_p ())
> +       dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
> +                        " Inlining %C into %C.\n",
> +                        callee, e->caller);
>        inline_call (e, true, NULL, NULL, false);
>        inlined = true;
>      }
> @@ -2755,9 +2764,9 @@ early_inliner (function *fun)
>      {
>        /* When the function is marked to be flattened, recursively inline
>          all calls in it.  */
> -      if (dump_file)
> -       fprintf (dump_file,
> -                "Flattening %s\n", node->name ());
> +      if (dump_enabled_p ())
> +       dump_printf (MSG_OPTIMIZED_LOCATIONS,
> +                    "Flattening %C\n", node);
>        flatten_function (node, true);
>        inlined = true;
>      }
> diff --git a/gcc/testsuite/g++.dg/ipa/devirt-12.C b/gcc/testsuite/g++.dg/ipa/devirt-12.C
> index 93ce251..60271a0 100644
> --- a/gcc/testsuite/g++.dg/ipa/devirt-12.C
> +++ b/gcc/testsuite/g++.dg/ipa/devirt-12.C
> @@ -1,5 +1,5 @@
>  // { dg-do compile { target c++11 } }
> -// { dg-options "-O -fdump-ipa-inline" }
> +// { dg-options "-O -fdump-ipa-inline-all" }
>
>  class Foo
>  {
> diff --git a/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C b/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
> index 37b7d87..00ac61e7 100644
> --- a/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
> +++ b/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
> @@ -1,7 +1,7 @@
>  /* Verify that virtual calls are folded even early inlining puts them into one
>     function with the definition.  */
>  /* { dg-do run } */
> -/* { dg-options "-O2 -fdump-tree-einline"  } */
> +/* { dg-options "-O2 -fdump-tree-einline-optimized"  } */
>
>  extern "C" void abort (void);
>
> diff --git a/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
> index 2156cec..b65d915 100644
> --- a/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
> +++ b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
> @@ -1,4 +1,4 @@
> -/* { dg-options "-O2 -fdump-tree-einline" } */
> +/* { dg-options "-O2 -fdump-tree-einline-all" } */
>  class DocId {
>   public:
>   DocId() { }
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
> index 4497fac..9c49ddb 100644
> --- a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
> +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
> +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=3" } */
>  /* { dg-add-options bind_pic_locally } */
>
>  namespace std {
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
> index 79f807c..b72f652 100644
> --- a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
> +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
> +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=3" } */
>  /* { dg-add-options bind_pic_locally } */
>
>  namespace std {
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
> index 0ad366e..131f12d 100644
> --- a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
> +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=5" } */
> +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=5" } */
>  /* { dg-add-options bind_pic_locally } */
>
>  #include <algorithm>
> diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-4.C b/gcc/testsuite/g++.dg/tree-ssa/inline-4.C
> new file mode 100644
> index 0000000..1dd8140
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-4.C
> @@ -0,0 +1,32 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fopt-info-inline --param max-early-inliner-iterations=3" } */
> +/* { dg-add-options bind_pic_locally } */
> +
> +namespace std {
> +  extern "C" int puts(const char *s);
> +}
> +
> +template <class T, class E> void
> +foreach (T b, T e, void (*ptr)(E))
> +{
> +  for (; b != e; b++)
> +    ptr(*b); // { dg-optimized "Inlining void inline_me\[^\\n\]* into int main\[^\\n\]*" }
> +}
> +
> +void
> +inline_me (char *x)
> +{
> +  std::puts(x);
> +}
> +
> +static void
> +inline_me_too (char *x)
> +{
> +  std::puts(x);
> +}
> +
> +int main(int argc, char **argv)
> +{
> +  foreach (argv, argv + argc, inline_me); // { dg-optimized "Inlining void foreach\[^\\n\]* into int main\[^\\n\]*" }
> +  foreach (argv, argv + argc, inline_me_too); // { dg-optimized "Inlining void foreach\[^\\n\]* into int main\[^\\n\]*" }
> +}
> diff --git a/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c b/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
> new file mode 100644
> index 0000000..4032ad1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
> @@ -0,0 +1,44 @@
> +/* { dg-options "-O3 -fopt-info-inline-optimized-missed" } */
> +
> +static int foo (int a)
> +{
> +  return a + 10;
> +}
> +
> +static int bar (int b)
> +{
> +  return b - 20;
> +}
> +
> +static int boo (int a, int b)
> +{
> +  return (foo (a)     /* { dg-optimized "Inlining foo/\[0-9\]+ into boo/\[0-9\]+" } */
> +         + bar (b)); /* { dg-optimized "Inlining bar/\[0-9\]+ into boo/\[0-9\]+" } */
> +}
> +
> +extern int v_a, v_b;
> +extern int result;
> +
> +int compute ()
> +{
> +  result = boo (v_a, v_b); /* { dg-optimized "Inlining boo/\[0-9\]+ into compute/\[0-9\]+" } */
> +
> +  return result;
> +}
> +
> +extern void not_available(int);
> +
> +int __attribute__ ((noinline,noclone)) get_input(void)
> +{
> +  return 1;
> +}
> +
> +int test_1 ()
> +{
> +  return get_input (); /* { dg-missed "not inlinable: test_1/\[0-9\]+ -> get_input/\[0-9\]+, function not inlinable" } */
> +}
> +
> +void test_2 (int v)
> +{
> +  not_available (1); /* { dg-missed "not inlinable: test_2/\[0-9\]+ -> not_available/\[0-9\]+, function body not available" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/ipa/inline-4.c b/gcc/testsuite/gcc.dg/ipa/inline-4.c
> index fdb4465..db4cfc6 100644
> --- a/gcc/testsuite/gcc.dg/ipa/inline-4.c
> +++ b/gcc/testsuite/gcc.dg/ipa/inline-4.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-Os -c -fdump-ipa-inline -fno-early-inlining -fno-partial-inlining -fno-ipa-cp"  } */
> +/* { dg-options "-Os -c -fdump-ipa-inline-all -fopt-info-inline -fno-early-inlining -fno-partial-inlining -fno-ipa-cp"  } */
>  /* { dg-add-options bind_pic_locally } */
>
>  void work_hard (void);
> @@ -20,7 +20,7 @@ void do_something (int shall_i_work)
>  }
>  int foo (int invariant)
>  {
> -  do_something (0);
> +  do_something (0); // { dg-optimized "Inlined do_something/\[0-9]+ into foo/\[0-9]+" }
>    do_something (1);
>  }
>
> diff --git a/gcc/testsuite/gcc.dg/ipa/inline-7.c b/gcc/testsuite/gcc.dg/ipa/inline-7.c
> index 5002aa0..7dabb14 100644
> --- a/gcc/testsuite/gcc.dg/ipa/inline-7.c
> +++ b/gcc/testsuite/gcc.dg/ipa/inline-7.c
> @@ -1,6 +1,6 @@
>  /* Check that early inliner works out that a is empty of parameter 0.  */
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-tree-einline -fno-partial-inlining"  } */
> +/* { dg-options "-O2 -fdump-tree-einline-optimized -fopt-info-inline -fno-partial-inlining"  } */
>  void t(void);
>  int a (int b)
>  {
> @@ -18,7 +18,7 @@ int a (int b)
>  void
>  m()
>  {
> - a(1);
> + a(1); /* { dg-optimized "Inlining a/\[0-9\]* into m/\[0-9\]*" } */
>   a(0);
>  }
> -/* { dg-final { scan-tree-dump-times "Inlining a into m" 1 "einline"  } } */
> +/* { dg-final { scan-tree-dump-times "Inlining a.* into m.*" 1 "einline"  } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c b/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
> index 656260a..ecb9a29 100644
> --- a/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
> +++ b/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
> @@ -35,5 +35,5 @@ test (int i)
>      lookup (9 * i);
>  }
>  /* { dg-final { scan-ipa-dump "Wrapper penalty"  "inline"  } } */
> -/* { dg-final { scan-ipa-dump-not "Inlined lookup_slow into lookup"  "inline"  } } */
> -/* { dg-final { scan-ipa-dump "Inlined lookup into test"  "inline"  } } */
> +/* { dg-final { scan-ipa-dump-not "Inlined lookup_slow/\[0-9\]* into lookup/\[0-9\]*"  "inline"  } } */
> +/* { dg-final { scan-ipa-dump "Inlined lookup/\[0-9\]* into test/\[0-9\]*"  "inline"  } } */
> diff --git a/gcc/testsuite/gcc.dg/plugin/dump-1.c b/gcc/testsuite/gcc.dg/plugin/dump-1.c
> index 95bd7a4..1538bf6 100644
> --- a/gcc/testsuite/gcc.dg/plugin/dump-1.c
> +++ b/gcc/testsuite/gcc.dg/plugin/dump-1.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-fopt-info-note" } */
> +/* { dg-options "-fopt-info-loop-note" } */
>
>  extern void test_string_literal (void);
>  extern void test_tree (void);
> diff --git a/gcc/testsuite/gcc.dg/plugin/dump-2.c b/gcc/testsuite/gcc.dg/plugin/dump-2.c
> index 961a3d3..04b82e5 100644
> --- a/gcc/testsuite/gcc.dg/plugin/dump-2.c
> +++ b/gcc/testsuite/gcc.dg/plugin/dump-2.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-fopt-info-note-internals" } */
> +/* { dg-options "-fopt-info-loop-note-internals" } */
>
>  extern void test_string_literal (void);
>  extern void test_tree (void);
> diff --git a/gcc/testsuite/gcc.dg/pr26570.c b/gcc/testsuite/gcc.dg/pr26570.c
> index 87b644a..d29bc35 100644
> --- a/gcc/testsuite/gcc.dg/pr26570.c
> +++ b/gcc/testsuite/gcc.dg/pr26570.c
> @@ -6,3 +6,4 @@ unsigned test (unsigned a, unsigned b)
>  {
>    return a / b;
>  } /* { dg-missed "\[^\n\]*execution counts estimated" } */
> +/* { dg-prune-output "function body not available" } */
> diff --git a/gcc/testsuite/gcc.dg/pr71969-2.c b/gcc/testsuite/gcc.dg/pr71969-2.c
> index f434fd0..73839a6 100644
> --- a/gcc/testsuite/gcc.dg/pr71969-2.c
> +++ b/gcc/testsuite/gcc.dg/pr71969-2.c
> @@ -20,4 +20,4 @@ main ()
>    return 0;
>  }
>
> -/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */
> +/* { dg-final { scan-tree-dump-times "Inlining foo/\[0-9\]* into main/\[0-9\]*" 4 "einline" } } */
> diff --git a/gcc/testsuite/gcc.dg/pr71969-3.c b/gcc/testsuite/gcc.dg/pr71969-3.c
> index 583d89d..189adfd 100644
> --- a/gcc/testsuite/gcc.dg/pr71969-3.c
> +++ b/gcc/testsuite/gcc.dg/pr71969-3.c
> @@ -35,4 +35,4 @@ main ()
>  }
>
>  /* { dg-final { scan-tree-dump-times "will not early inline" 8 "einline" } } */
> -/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */
> +/* { dg-final { scan-tree-dump-times "Inlining foo/\[0-9\]* into main/\[0-9\]*" 4 "einline" } } */
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
> index 6f0ff68..5673c32 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
> @@ -1,6 +1,6 @@
>  /* { dg-do compile } */
>  /* { dg-require-weak "" } */
> -/* { dg-options "-O2 -fdump-tree-einline" } */
> +/* { dg-options "-O2 -fdump-tree-einline-all" } */
>  int w;
>  int bar (void) __attribute__ ((weak));
>  int bar (){
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
> index 2998989..cd441af 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=2" } */
> +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=2" } */
>  /* { dg-add-options bind_pic_locally } */
>
>  extern void inlined ();
> @@ -27,5 +27,5 @@ inline_me_too (void)
>  {
>    inlined();
>  }
> -/* { dg-final { scan-tree-dump-times "Inlining inline_me " 1 "einline"} } */
> -/* { dg-final { scan-tree-dump-times "Inlining inline_me_too " 1 "einline"} } */
> +/* { dg-final { scan-tree-dump-times "Inlining inline_me/\[0-9\]* " 1 "einline"} } */
> +/* { dg-final { scan-tree-dump-times "Inlining inline_me_too/\[0-9\]* " 1 "einline"} } */
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
> index c9f7978..93412fa 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-tree-einline" } */
> +/* { dg-options "-O2 -fdump-tree-einline-optimized -fopt-info-inline" } */
>  /* { dg-add-options bind_pic_locally } */
>
>  extern int rand(void);
> @@ -13,7 +13,7 @@ int my_id;
>
>  int main()
>  {
> -  int res = get_data_for (my_id);
> +  int res = get_data_for (my_id); /* { dg-optimized "Inlining get_data_for/\[0-9\]+ into main/\[0-9\]+." } */
>    switch (res)
>      {
>        case 0:
> @@ -23,4 +23,4 @@ int main()
>      }
>  }
>
> -/* { dg-final { scan-tree-dump "Inlining get_data_for into main" "einline" } } */
> +/* { dg-final { scan-tree-dump "Inlining get_data_for/\[0-9\]* into main/\[0-9\]*" "einline" } } */
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
> index 6da886e..f87e0b5 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O -finline-small-functions --param early-inlining-insns=0 -fdump-tree-einline" } */
> +/* { dg-options "-O -finline-small-functions --param early-inlining-insns=0 -fdump-tree-einline-optimized" } */
>
>  int foo0();
>  void bar0() { foo0(); }
> diff --git a/gcc/testsuite/gfortran.dg/pr79966.f90 b/gcc/testsuite/gfortran.dg/pr79966.f90
> index eee43fb..2170afd 100644
> --- a/gcc/testsuite/gfortran.dg/pr79966.f90
> +++ b/gcc/testsuite/gfortran.dg/pr79966.f90
> @@ -109,4 +109,4 @@ contains
>    call RunTPTests()
>    end program
>
> -! { dg-final { scan-ipa-dump "Inlined tp_sum into runtptests" "inline" } }
> +! { dg-final { scan-ipa-dump "Inlined tp_sum/\[0-9\]+ into runtptests/\[0-9\]+" "inline" } }
> diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
> index 297fcd7..5ce319a 100644
> --- a/gcc/tree-inline.c
> +++ b/gcc/tree-inline.c
> @@ -4673,14 +4673,20 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
>    /* Add local vars in this inlined callee to caller.  */
>    add_local_variables (id->src_cfun, cfun, id);
>
> -  if (dump_file && (dump_flags & TDF_DETAILS))
> +  if (dump_enabled_p ())
>      {
> -      fprintf (dump_file, "Inlining %s to %s with frequency %4.2f\n",
> -              id->src_node->dump_name (),
> -              id->dst_node->dump_name (),
> -              cg_edge->sreal_frequency ().to_double ());
> -      id->src_node->dump (dump_file);
> -      id->dst_node->dump (dump_file);
> +      char buf[128];
> +      snprintf (buf, sizeof(buf), "%4.2f",
> +               cg_edge->sreal_frequency ().to_double ());
> +      dump_printf_loc (MSG_NOTE | MSG_PRIORITY_INTERNALS,
> +                      call_stmt,
> +                      "Inlining %C to %C with frequency %s\n",
> +                      id->src_node, id->dst_node, buf);
> +      if (dump_file && (dump_flags & TDF_DETAILS))
> +       {
> +         id->src_node->dump (dump_file);
> +         id->dst_node->dump (dump_file);
> +       }
>      }
>
>    /* This is it.  Duplicate the callee body.  Assume callee is
> --
> 1.8.5.3
>
Christophe Lyon Nov. 8, 2018, 6:38 p.m. | #2
On Thu, 8 Nov 2018 at 12:33, Richard Biener <richard.guenther@gmail.com> wrote:
>
> On Wed, Nov 7, 2018 at 5:22 PM David Malcolm <dmalcolm@redhat.com> wrote:
> >
> > This patch ports various fprintf calls in the inlining code to using
> > the dump API, using the %C format code for printing cgraph_node *.
> > I focused on the dump messages that seemed most significant to
> > end-users; I didn't port all of the calls.
> >
> > Doing so makes this information appear in -fopt-info and in
> > optimization records, rather than just in the dump_file.
> >
> > It also changes the affected dumpfile-dumps from being unconditional
> > (assuming the dump_file is enabled) to being guarded by the MSG_*
> > status.  Hence various tests with dg-final scan-*-dump directives
> > need to gain "-all" or "-optimized" suffixes to -fdump-ipa-inline.
> >
> > The use of %C throughout also slightly changes the dump format for
> > several messages, e.g. changing:
> >
> >  Inlining void inline_me(char*) into int main(int, char**).
> >
> > to:
> >
> > ../../src/gcc/testsuite/g++.dg/tree-ssa/inline-1.C:13:8: optimized:  Inlining void inline_me(char*)/0 into int main(int, char**)/2.
> >
> > amongst other things adding "/order" suffixes to the cgraph node
> > names.
> >
> > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu, in
> > conjunction with the rest of the patch kit.
> >

Hi,

This patch breaks my builds:
/tmp/9837775_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/doc//invoke.texi:14118:
@option expected braces.
/tmp/9837775_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/doc//invoke.texi:14118:
Misplaced {.
/tmp/9837775_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/doc//invoke.texi:14118:
Misplaced }.
/tmp/9837775_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/doc//invoke.texi:14118:
@code missing close brace.
makeinfo: Removing output file `doc/gcc.info' due to errors; use
--force to preserve.
make[2]: *** [doc/gcc.info] Error 1

It is a problem of makeinfo version ? (I'm using RHEL6's)

Christophe

> > OK for trunk?
>
> OK.
>
> Thanks for doing this!
> Richard.
>
> > gcc/ChangeLog:
> >         PR ipa/86395
> >         * doc/invoke.texi (-fdump-ipa-): Document the "-optimized",
> >         "-missed", "-note", and "-all" sub-options.
> >         * ipa-inline.c (caller_growth_limits): Port from fprintf to dump
> >         API.
> >         (can_early_inline_edge_p): Likewise.
> >         (want_early_inline_function_p): Likewise.
> >         (want_inline_self_recursive_call_p): Likewise.
> >         (recursive_inlining): Likewise.
> >         (inline_small_functions): Likewise.
> >         (flatten_function): Likewise.
> >         (ipa_inline): Likewise.
> >         (inline_always_inline_functions): Likewise.
> >         (early_inline_small_functions): Likewise.
> >         (early_inliner): Likewise.
> >         * tree-inline.c (expand_call_inline): Likewise.
> >
> > gcc/testsuite/ChangeLog:
> >         PR ipa/86395
> >         * g++.dg/ipa/devirt-12.C: Add "-all" suffix to
> >         "-fdump-ipa-inline".
> >         * g++.dg/ipa/imm-devirt-1.C: Add "-optimized" suffix to
> >         "-fdump-tree-einline".
> >         * g++.dg/tree-prof/inline_mismatch_args.C: Add "-all" suffix to
> >         "-fdump-tree-einline".
> >         * g++.dg/tree-ssa/inline-1.C: Add "-optimized" suffix to
> >         "-fdump-tree-einline".
> >         * g++.dg/tree-ssa/inline-2.C: Likewise.
> >         * g++.dg/tree-ssa/inline-3.C: Likewise.
> >         * g++.dg/tree-ssa/inline-4.C: New test, based on inline-1.C, but
> >         using "-fopt-info-inline".
> >         * gcc.dg/ipa/fopt-info-inline-1.c: New test.
> >         * gcc.dg/ipa/inline-4.c:  Add "-all" suffix to
> >         "-fdump-ipa-inline".  Add "-fopt-info-inline" and dg-optimized
> >         directive.
> >         * gcc.dg/ipa/inline-7.c: Add "-optimized" suffix to
> >         "-fdump-tree-einline".  Add "-fopt-info-inline" and dg-optimized
> >         directive.  Update scan-tree-dump-times to reflect /order
> >         suffixes.
> >         * gcc.dg/ipa/inlinehint-4.c: Update scan-tree-dump-times to
> >         reflect /order suffixes.
> >         * gcc.dg/plugin/dump-1.c: Add "-loop" to "-fopt-info-note" to
> >         avoid getting extra messages from inliner.
> >         * gcc.dg/plugin/dump-2.c: Likewise.
> >         * gcc.dg/pr26570.c: Add dg-prune-output to ignore new
> >         "function body not available" missed optimization messages.
> >         * gcc.dg/pr71969-2.c: Update scan-tree-dump-times to reflect
> >         /order suffixes.
> >         * gcc.dg/pr71969-3.c: Likewise.
> >         * gcc.dg/tree-ssa/inline-11.c: Add "-all" suffix to
> >         "-fdump-tree-einline".
> >         * gcc.dg/tree-ssa/inline-3.c: Add "-optimized" suffix to
> >         "-fdump-tree-einline".  Update scan-tree-dump-times to reflect
> >         /order suffixes.
> >         * gcc.dg/tree-ssa/inline-4.c: Add "-optimized" suffix to
> >         "-fdump-tree-einline".  Add "-fopt-info-inline" and dg-optimized
> >         directive.
> >         * gcc.dg/tree-ssa/inline-8.c: Add "-optimized" suffix to
> >         "-fdump-tree-einline".
> >         * gfortran.dg/pr79966.f90: Update scan-ipa-dump to reflect /order
> >         suffixes.
> > ---
> >  gcc/doc/invoke.texi                                |  13 ++
> >  gcc/ipa-inline.c                                   | 191 +++++++++++----------
> >  gcc/testsuite/g++.dg/ipa/devirt-12.C               |   2 +-
> >  gcc/testsuite/g++.dg/ipa/imm-devirt-1.C            |   2 +-
> >  .../g++.dg/tree-prof/inline_mismatch_args.C        |   2 +-
> >  gcc/testsuite/g++.dg/tree-ssa/inline-1.C           |   2 +-
> >  gcc/testsuite/g++.dg/tree-ssa/inline-2.C           |   2 +-
> >  gcc/testsuite/g++.dg/tree-ssa/inline-3.C           |   2 +-
> >  gcc/testsuite/g++.dg/tree-ssa/inline-4.C           |  32 ++++
> >  gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c      |  44 +++++
> >  gcc/testsuite/gcc.dg/ipa/inline-4.c                |   4 +-
> >  gcc/testsuite/gcc.dg/ipa/inline-7.c                |   6 +-
> >  gcc/testsuite/gcc.dg/ipa/inlinehint-4.c            |   4 +-
> >  gcc/testsuite/gcc.dg/plugin/dump-1.c               |   2 +-
> >  gcc/testsuite/gcc.dg/plugin/dump-2.c               |   2 +-
> >  gcc/testsuite/gcc.dg/pr26570.c                     |   1 +
> >  gcc/testsuite/gcc.dg/pr71969-2.c                   |   2 +-
> >  gcc/testsuite/gcc.dg/pr71969-3.c                   |   2 +-
> >  gcc/testsuite/gcc.dg/tree-ssa/inline-11.c          |   2 +-
> >  gcc/testsuite/gcc.dg/tree-ssa/inline-3.c           |   6 +-
> >  gcc/testsuite/gcc.dg/tree-ssa/inline-4.c           |   6 +-
> >  gcc/testsuite/gcc.dg/tree-ssa/inline-8.c           |   2 +-
> >  gcc/testsuite/gfortran.dg/pr79966.f90              |   2 +-
> >  gcc/tree-inline.c                                  |  20 ++-
> >  24 files changed, 229 insertions(+), 124 deletions(-)
> >  create mode 100644 gcc/testsuite/g++.dg/tree-ssa/inline-4.C
> >  create mode 100644 gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
> >
> > diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> > index 055e8c4..97de735 100644
> > --- a/gcc/doc/invoke.texi
> > +++ b/gcc/doc/invoke.texi
> > @@ -14062,6 +14062,7 @@ instruction numbers for the links to the previous and next instructions
> >  in a sequence.
> >
> >  @item -fdump-ipa-@var{switch}
> > +@itemx -fdump-ipa-@var{switch}-@var{options}
> >  @opindex fdump-ipa
> >  Control the dumping at various stages of inter-procedural analysis
> >  language tree to a file.  The file name is generated by appending a
> > @@ -14082,6 +14083,18 @@ Dump after function inlining.
> >
> >  @end table
> >
> > +Additionally, the options @option{-optimized}, @option{-missed},
> > +@option{-note}, and @option{-all} can be provided, with the same meaning
> > +as for @option{-fopt-info}, defaulting to @option{-optimized}.
> > +
> > +For example, @option{-fdump-ipa-inline-optimized-missed} will emit
> > +information on callsites that were inlined, along with callsites
> > +that were not inlined.
> > +
> > +By default, the dump will contain messages about successful
> > +optimizations (equivalent to @option {-optimized}) together with
> > +low-level details about the analysis.
> > +
> >  @item -fdump-lang-all
> >  @itemx -fdump-lang-@var{switch}
> >  @itemx -fdump-lang-@var{switch}-@var{options}
> > diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
> > index 4f8ed15..8d0762d 100644
> > --- a/gcc/ipa-inline.c
> > +++ b/gcc/ipa-inline.c
> > @@ -227,20 +227,21 @@ caller_growth_limits (struct cgraph_edge *e)
> >  static void
> >  report_inline_failed_reason (struct cgraph_edge *e)
> >  {
> > -  if (dump_file)
> > +  if (dump_enabled_p ())
> >      {
> > -      fprintf (dump_file, "  not inlinable: %s -> %s, %s\n",
> > -              e->caller->dump_name (),
> > -              e->callee->dump_name (),
> > -              cgraph_inline_failed_string (e->inline_failed));
> > +      dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                      "  not inlinable: %C -> %C, %s\n",
> > +                      e->caller, e->callee,
> > +                      cgraph_inline_failed_string (e->inline_failed));
> >        if ((e->inline_failed == CIF_TARGET_OPTION_MISMATCH
> >            || e->inline_failed == CIF_OPTIMIZATION_MISMATCH)
> >           && e->caller->lto_file_data
> >           && e->callee->ultimate_alias_target ()->lto_file_data)
> >         {
> > -         fprintf (dump_file, "  LTO objects: %s, %s\n",
> > -                  e->caller->lto_file_data->file_name,
> > -                  e->callee->ultimate_alias_target ()->lto_file_data->file_name);
> > +         dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                          "  LTO objects: %s, %s\n",
> > +                          e->caller->lto_file_data->file_name,
> > +                          e->callee->ultimate_alias_target ()->lto_file_data->file_name);
> >         }
> >        if (e->inline_failed == CIF_TARGET_OPTION_MISMATCH)
> >         cl_target_option_print_diff
> > @@ -569,8 +570,9 @@ can_early_inline_edge_p (struct cgraph_edge *e)
> >    if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->decl))
> >        || !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
> >      {
> > -      if (dump_file)
> > -       fprintf (dump_file, "  edge not inlinable: not in SSA form\n");
> > +      if (dump_enabled_p ())
> > +       dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                        "  edge not inlinable: not in SSA form\n");
> >        return false;
> >      }
> >    if (!can_inline_edge_p (e, true, true)
> > @@ -630,34 +632,34 @@ want_early_inline_function_p (struct cgraph_edge *e)
> >        else if (!e->maybe_hot_p ()
> >                && growth > 0)
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file, "  will not early inline: %s->%s, "
> > -                    "call is cold and code would grow by %i\n",
> > -                    e->caller->dump_name (),
> > -                    callee->dump_name (),
> > -                    growth);
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "  will not early inline: %C->%C, "
> > +                            "call is cold and code would grow by %i\n",
> > +                            e->caller, callee,
> > +                            growth);
> >           want_inline = false;
> >         }
> >        else if (growth > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file, "  will not early inline: %s->%s, "
> > -                    "growth %i exceeds --param early-inlining-insns\n",
> > -                    e->caller->dump_name (),
> > -                    callee->dump_name (),
> > -                    growth);
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "  will not early inline: %C->%C, "
> > +                            "growth %i exceeds --param early-inlining-insns\n",
> > +                            e->caller, callee,
> > +                            growth);
> >           want_inline = false;
> >         }
> >        else if ((n = num_calls (callee)) != 0
> >                && growth * (n + 1) > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file, "  will not early inline: %s->%s, "
> > -                    "growth %i exceeds --param early-inlining-insns "
> > -                    "divided by number of calls\n",
> > -                    e->caller->dump_name (),
> > -                    callee->dump_name (),
> > -                    growth);
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "  will not early inline: %C->%C, "
> > +                            "growth %i exceeds --param early-inlining-insns "
> > +                            "divided by number of calls\n",
> > +                            e->caller, callee,
> > +                            growth);
> >           want_inline = false;
> >         }
> >      }
> > @@ -936,8 +938,9 @@ want_inline_self_recursive_call_p (struct cgraph_edge *edge,
> >           want_inline = false;
> >         }
> >      }
> > -  if (!want_inline && dump_file)
> > -    fprintf (dump_file, "   not inlining recursively: %s\n", reason);
> > +  if (!want_inline && dump_enabled_p ())
> > +    dump_printf_loc (MSG_MISSED_OPTIMIZATION, edge->call_stmt,
> > +                    "   not inlining recursively: %s\n", reason);
> >    return want_inline;
> >  }
> >
> > @@ -1562,14 +1565,14 @@ recursive_inlining (struct cgraph_edge *edge,
> >    if (!master_clone)
> >      return false;
> >
> > -  if (dump_file)
> > -    fprintf (dump_file,
> > -            "\n   Inlined %i times, "
> > -            "body grown from size %i to %i, time %f to %f\n", n,
> > -            ipa_fn_summaries->get (master_clone)->size,
> > -            ipa_fn_summaries->get (node)->size,
> > -            ipa_fn_summaries->get (master_clone)->time.to_double (),
> > -            ipa_fn_summaries->get (node)->time.to_double ());
> > +  if (dump_enabled_p ())
> > +    dump_printf_loc (MSG_NOTE, edge->call_stmt,
> > +                    "\n   Inlined %i times, "
> > +                    "body grown from size %i to %i, time %f to %f\n", n,
> > +                    ipa_fn_summaries->get (master_clone)->size,
> > +                    ipa_fn_summaries->get (node)->size,
> > +                    ipa_fn_summaries->get (master_clone)->time.to_double (),
> > +                    ipa_fn_summaries->get (node)->time.to_double ());
> >
> >    /* Remove master clone we used for inlining.  We rely that clones inlined
> >       into master clone gets queued just before master clone so we don't
> > @@ -2078,17 +2081,20 @@ inline_small_functions (void)
> >         update_callee_keys (&edge_heap, n, updated_nodes);
> >        bitmap_clear (updated_nodes);
> >
> > -      if (dump_file)
> > +      if (dump_enabled_p ())
> >         {
> >           ipa_fn_summary *s = ipa_fn_summaries->get (edge->caller);
> > -         fprintf (dump_file,
> > -                  " Inlined %s into %s which now has time %f and size %i, "
> > -                  "net change of %+i.\n",
> > -                  xstrdup_for_dump (edge->callee->name ()),
> > -                  xstrdup_for_dump (edge->caller->name ()),
> > -                  s->time.to_double (),
> > -                  s->size,
> > -                  overall_size - old_size);
> > +
> > +         /* dump_printf can't handle %+i.  */
> > +         char buf_net_change[100];
> > +         snprintf (buf_net_change, sizeof buf_net_change, "%+i",
> > +                   overall_size - old_size);
> > +
> > +         dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, edge->call_stmt,
> > +                          " Inlined %C into %C which now has time %f and "
> > +                          "size %i, net change of %s.\n",
> > +                          edge->callee, edge->caller,
> > +                          s->time.to_double (), s->size, buf_net_change);
> >         }
> >        if (min_size > overall_size)
> >         {
> > @@ -2101,11 +2107,11 @@ inline_small_functions (void)
> >      }
> >
> >    free_growth_caches ();
> > -  if (dump_file)
> > -    fprintf (dump_file,
> > -            "Unit growth for small function inlining: %i->%i (%i%%)\n",
> > -            initial_size, overall_size,
> > -            initial_size ? overall_size * 100 / (initial_size) - 100: 0);
> > +  if (dump_enabled_p ())
> > +    dump_printf (MSG_NOTE,
> > +                "Unit growth for small function inlining: %i->%i (%i%%)\n",
> > +                initial_size, overall_size,
> > +                initial_size ? overall_size * 100 / (initial_size) - 100: 0);
> >    symtab->remove_edge_removal_hook (edge_removal_hook_holder);
> >  }
> >
> > @@ -2130,11 +2136,10 @@ flatten_function (struct cgraph_node *node, bool early)
> >        /* We've hit cycle?  It is time to give up.  */
> >        if (callee->aux)
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file,
> > -                    "Not inlining %s into %s to avoid cycle.\n",
> > -                    xstrdup_for_dump (callee->name ()),
> > -                    xstrdup_for_dump (e->caller->name ()));
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "Not inlining %C into %C to avoid cycle.\n",
> > +                            callee, e->caller);
> >           if (cgraph_inline_failed_type (e->inline_failed) != CIF_FINAL_ERROR)
> >             e->inline_failed = CIF_RECURSIVE_INLINING;
> >           continue;
> > @@ -2159,25 +2164,27 @@ flatten_function (struct cgraph_node *node, bool early)
> >
> >        if (e->recursive_p ())
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file, "Not inlining: recursive call.\n");
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "Not inlining: recursive call.\n");
> >           continue;
> >         }
> >
> >        if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
> >           != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file, "Not inlining: SSA form does not match.\n");
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "Not inlining: SSA form does not match.\n");
> >           continue;
> >         }
> >
> >        /* Inline the edge and flatten the inline clone.  Avoid
> >           recursing through the original node if the node was cloned.  */
> > -      if (dump_file)
> > -       fprintf (dump_file, " Inlining %s into %s.\n",
> > -                xstrdup_for_dump (callee->name ()),
> > -                xstrdup_for_dump (e->caller->name ()));
> > +      if (dump_enabled_p ())
> > +       dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
> > +                        " Inlining %C into %C.\n",
> > +                        callee, e->caller);
> >        orig_callee = callee;
> >        inline_call (e, true, NULL, NULL, false);
> >        if (e->callee != orig_callee)
> > @@ -2589,13 +2596,12 @@ ipa_inline (void)
> >    /* Free ipa-prop structures if they are no longer needed.  */
> >    ipa_free_all_structures_after_iinln ();
> >
> > +  if (dump_enabled_p ())
> > +    dump_printf (MSG_NOTE,
> > +                "\nInlined %i calls, eliminated %i functions\n\n",
> > +                ncalls_inlined, nfunctions_inlined);
> >    if (dump_file)
> > -    {
> > -      fprintf (dump_file,
> > -              "\nInlined %i calls, eliminated %i functions\n\n",
> > -              ncalls_inlined, nfunctions_inlined);
> > -      dump_inline_stats ();
> > -    }
> > +    dump_inline_stats ();
> >
> >    if (dump_file)
> >      ipa_dump_fn_summaries (dump_file);
> > @@ -2618,9 +2624,10 @@ inline_always_inline_functions (struct cgraph_node *node)
> >
> >        if (e->recursive_p ())
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file, "  Not inlining recursive call to %s.\n",
> > -                    e->callee->name ());
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "  Not inlining recursive call to %C.\n",
> > +                            e->callee);
> >           e->inline_failed = CIF_RECURSIVE_INLINING;
> >           continue;
> >         }
> > @@ -2636,10 +2643,10 @@ inline_always_inline_functions (struct cgraph_node *node)
> >           continue;
> >         }
> >
> > -      if (dump_file)
> > -       fprintf (dump_file, "  Inlining %s into %s (always_inline).\n",
> > -                xstrdup_for_dump (e->callee->name ()),
> > -                xstrdup_for_dump (e->caller->name ()));
> > +      if (dump_enabled_p ())
> > +       dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
> > +                        "  Inlining %C into %C (always_inline).\n",
> > +                        e->callee, e->caller);
> >        inline_call (e, true, NULL, NULL, false);
> >        inlined = true;
> >      }
> > @@ -2675,27 +2682,29 @@ early_inline_small_functions (struct cgraph_node *node)
> >           && !opt_for_fn (node->decl, flag_inline_functions))
> >         continue;
> >
> > -      if (dump_file)
> > -       fprintf (dump_file, "Considering inline candidate %s.\n",
> > -                callee->name ());
> > +      if (dump_enabled_p ())
> > +       dump_printf_loc (MSG_NOTE, e->call_stmt,
> > +                        "Considering inline candidate %C.\n",
> > +                        callee);
> >
> >        if (!can_early_inline_edge_p (e))
> >         continue;
> >
> >        if (e->recursive_p ())
> >         {
> > -         if (dump_file)
> > -           fprintf (dump_file, "  Not inlining: recursive call.\n");
> > +         if (dump_enabled_p ())
> > +           dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
> > +                            "  Not inlining: recursive call.\n");
> >           continue;
> >         }
> >
> >        if (!want_early_inline_function_p (e))
> >         continue;
> >
> > -      if (dump_file)
> > -       fprintf (dump_file, " Inlining %s into %s.\n",
> > -                xstrdup_for_dump (callee->name ()),
> > -                xstrdup_for_dump (e->caller->name ()));
> > +      if (dump_enabled_p ())
> > +       dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
> > +                        " Inlining %C into %C.\n",
> > +                        callee, e->caller);
> >        inline_call (e, true, NULL, NULL, false);
> >        inlined = true;
> >      }
> > @@ -2755,9 +2764,9 @@ early_inliner (function *fun)
> >      {
> >        /* When the function is marked to be flattened, recursively inline
> >          all calls in it.  */
> > -      if (dump_file)
> > -       fprintf (dump_file,
> > -                "Flattening %s\n", node->name ());
> > +      if (dump_enabled_p ())
> > +       dump_printf (MSG_OPTIMIZED_LOCATIONS,
> > +                    "Flattening %C\n", node);
> >        flatten_function (node, true);
> >        inlined = true;
> >      }
> > diff --git a/gcc/testsuite/g++.dg/ipa/devirt-12.C b/gcc/testsuite/g++.dg/ipa/devirt-12.C
> > index 93ce251..60271a0 100644
> > --- a/gcc/testsuite/g++.dg/ipa/devirt-12.C
> > +++ b/gcc/testsuite/g++.dg/ipa/devirt-12.C
> > @@ -1,5 +1,5 @@
> >  // { dg-do compile { target c++11 } }
> > -// { dg-options "-O -fdump-ipa-inline" }
> > +// { dg-options "-O -fdump-ipa-inline-all" }
> >
> >  class Foo
> >  {
> > diff --git a/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C b/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
> > index 37b7d87..00ac61e7 100644
> > --- a/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
> > +++ b/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
> > @@ -1,7 +1,7 @@
> >  /* Verify that virtual calls are folded even early inlining puts them into one
> >     function with the definition.  */
> >  /* { dg-do run } */
> > -/* { dg-options "-O2 -fdump-tree-einline"  } */
> > +/* { dg-options "-O2 -fdump-tree-einline-optimized"  } */
> >
> >  extern "C" void abort (void);
> >
> > diff --git a/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
> > index 2156cec..b65d915 100644
> > --- a/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
> > +++ b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
> > @@ -1,4 +1,4 @@
> > -/* { dg-options "-O2 -fdump-tree-einline" } */
> > +/* { dg-options "-O2 -fdump-tree-einline-all" } */
> >  class DocId {
> >   public:
> >   DocId() { }
> > diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
> > index 4497fac..9c49ddb 100644
> > --- a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
> > +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
> > +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=3" } */
> >  /* { dg-add-options bind_pic_locally } */
> >
> >  namespace std {
> > diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
> > index 79f807c..b72f652 100644
> > --- a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
> > +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
> > +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=3" } */
> >  /* { dg-add-options bind_pic_locally } */
> >
> >  namespace std {
> > diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
> > index 0ad366e..131f12d 100644
> > --- a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
> > +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=5" } */
> > +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=5" } */
> >  /* { dg-add-options bind_pic_locally } */
> >
> >  #include <algorithm>
> > diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-4.C b/gcc/testsuite/g++.dg/tree-ssa/inline-4.C
> > new file mode 100644
> > index 0000000..1dd8140
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-4.C
> > @@ -0,0 +1,32 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-O2 -fopt-info-inline --param max-early-inliner-iterations=3" } */
> > +/* { dg-add-options bind_pic_locally } */
> > +
> > +namespace std {
> > +  extern "C" int puts(const char *s);
> > +}
> > +
> > +template <class T, class E> void
> > +foreach (T b, T e, void (*ptr)(E))
> > +{
> > +  for (; b != e; b++)
> > +    ptr(*b); // { dg-optimized "Inlining void inline_me\[^\\n\]* into int main\[^\\n\]*" }
> > +}
> > +
> > +void
> > +inline_me (char *x)
> > +{
> > +  std::puts(x);
> > +}
> > +
> > +static void
> > +inline_me_too (char *x)
> > +{
> > +  std::puts(x);
> > +}
> > +
> > +int main(int argc, char **argv)
> > +{
> > +  foreach (argv, argv + argc, inline_me); // { dg-optimized "Inlining void foreach\[^\\n\]* into int main\[^\\n\]*" }
> > +  foreach (argv, argv + argc, inline_me_too); // { dg-optimized "Inlining void foreach\[^\\n\]* into int main\[^\\n\]*" }
> > +}
> > diff --git a/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c b/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
> > new file mode 100644
> > index 0000000..4032ad1
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
> > @@ -0,0 +1,44 @@
> > +/* { dg-options "-O3 -fopt-info-inline-optimized-missed" } */
> > +
> > +static int foo (int a)
> > +{
> > +  return a + 10;
> > +}
> > +
> > +static int bar (int b)
> > +{
> > +  return b - 20;
> > +}
> > +
> > +static int boo (int a, int b)
> > +{
> > +  return (foo (a)     /* { dg-optimized "Inlining foo/\[0-9\]+ into boo/\[0-9\]+" } */
> > +         + bar (b)); /* { dg-optimized "Inlining bar/\[0-9\]+ into boo/\[0-9\]+" } */
> > +}
> > +
> > +extern int v_a, v_b;
> > +extern int result;
> > +
> > +int compute ()
> > +{
> > +  result = boo (v_a, v_b); /* { dg-optimized "Inlining boo/\[0-9\]+ into compute/\[0-9\]+" } */
> > +
> > +  return result;
> > +}
> > +
> > +extern void not_available(int);
> > +
> > +int __attribute__ ((noinline,noclone)) get_input(void)
> > +{
> > +  return 1;
> > +}
> > +
> > +int test_1 ()
> > +{
> > +  return get_input (); /* { dg-missed "not inlinable: test_1/\[0-9\]+ -> get_input/\[0-9\]+, function not inlinable" } */
> > +}
> > +
> > +void test_2 (int v)
> > +{
> > +  not_available (1); /* { dg-missed "not inlinable: test_2/\[0-9\]+ -> not_available/\[0-9\]+, function body not available" } */
> > +}
> > diff --git a/gcc/testsuite/gcc.dg/ipa/inline-4.c b/gcc/testsuite/gcc.dg/ipa/inline-4.c
> > index fdb4465..db4cfc6 100644
> > --- a/gcc/testsuite/gcc.dg/ipa/inline-4.c
> > +++ b/gcc/testsuite/gcc.dg/ipa/inline-4.c
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-Os -c -fdump-ipa-inline -fno-early-inlining -fno-partial-inlining -fno-ipa-cp"  } */
> > +/* { dg-options "-Os -c -fdump-ipa-inline-all -fopt-info-inline -fno-early-inlining -fno-partial-inlining -fno-ipa-cp"  } */
> >  /* { dg-add-options bind_pic_locally } */
> >
> >  void work_hard (void);
> > @@ -20,7 +20,7 @@ void do_something (int shall_i_work)
> >  }
> >  int foo (int invariant)
> >  {
> > -  do_something (0);
> > +  do_something (0); // { dg-optimized "Inlined do_something/\[0-9]+ into foo/\[0-9]+" }
> >    do_something (1);
> >  }
> >
> > diff --git a/gcc/testsuite/gcc.dg/ipa/inline-7.c b/gcc/testsuite/gcc.dg/ipa/inline-7.c
> > index 5002aa0..7dabb14 100644
> > --- a/gcc/testsuite/gcc.dg/ipa/inline-7.c
> > +++ b/gcc/testsuite/gcc.dg/ipa/inline-7.c
> > @@ -1,6 +1,6 @@
> >  /* Check that early inliner works out that a is empty of parameter 0.  */
> >  /* { dg-do compile } */
> > -/* { dg-options "-O2 -fdump-tree-einline -fno-partial-inlining"  } */
> > +/* { dg-options "-O2 -fdump-tree-einline-optimized -fopt-info-inline -fno-partial-inlining"  } */
> >  void t(void);
> >  int a (int b)
> >  {
> > @@ -18,7 +18,7 @@ int a (int b)
> >  void
> >  m()
> >  {
> > - a(1);
> > + a(1); /* { dg-optimized "Inlining a/\[0-9\]* into m/\[0-9\]*" } */
> >   a(0);
> >  }
> > -/* { dg-final { scan-tree-dump-times "Inlining a into m" 1 "einline"  } } */
> > +/* { dg-final { scan-tree-dump-times "Inlining a.* into m.*" 1 "einline"  } } */
> > diff --git a/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c b/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
> > index 656260a..ecb9a29 100644
> > --- a/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
> > +++ b/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
> > @@ -35,5 +35,5 @@ test (int i)
> >      lookup (9 * i);
> >  }
> >  /* { dg-final { scan-ipa-dump "Wrapper penalty"  "inline"  } } */
> > -/* { dg-final { scan-ipa-dump-not "Inlined lookup_slow into lookup"  "inline"  } } */
> > -/* { dg-final { scan-ipa-dump "Inlined lookup into test"  "inline"  } } */
> > +/* { dg-final { scan-ipa-dump-not "Inlined lookup_slow/\[0-9\]* into lookup/\[0-9\]*"  "inline"  } } */
> > +/* { dg-final { scan-ipa-dump "Inlined lookup/\[0-9\]* into test/\[0-9\]*"  "inline"  } } */
> > diff --git a/gcc/testsuite/gcc.dg/plugin/dump-1.c b/gcc/testsuite/gcc.dg/plugin/dump-1.c
> > index 95bd7a4..1538bf6 100644
> > --- a/gcc/testsuite/gcc.dg/plugin/dump-1.c
> > +++ b/gcc/testsuite/gcc.dg/plugin/dump-1.c
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-fopt-info-note" } */
> > +/* { dg-options "-fopt-info-loop-note" } */
> >
> >  extern void test_string_literal (void);
> >  extern void test_tree (void);
> > diff --git a/gcc/testsuite/gcc.dg/plugin/dump-2.c b/gcc/testsuite/gcc.dg/plugin/dump-2.c
> > index 961a3d3..04b82e5 100644
> > --- a/gcc/testsuite/gcc.dg/plugin/dump-2.c
> > +++ b/gcc/testsuite/gcc.dg/plugin/dump-2.c
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-fopt-info-note-internals" } */
> > +/* { dg-options "-fopt-info-loop-note-internals" } */
> >
> >  extern void test_string_literal (void);
> >  extern void test_tree (void);
> > diff --git a/gcc/testsuite/gcc.dg/pr26570.c b/gcc/testsuite/gcc.dg/pr26570.c
> > index 87b644a..d29bc35 100644
> > --- a/gcc/testsuite/gcc.dg/pr26570.c
> > +++ b/gcc/testsuite/gcc.dg/pr26570.c
> > @@ -6,3 +6,4 @@ unsigned test (unsigned a, unsigned b)
> >  {
> >    return a / b;
> >  } /* { dg-missed "\[^\n\]*execution counts estimated" } */
> > +/* { dg-prune-output "function body not available" } */
> > diff --git a/gcc/testsuite/gcc.dg/pr71969-2.c b/gcc/testsuite/gcc.dg/pr71969-2.c
> > index f434fd0..73839a6 100644
> > --- a/gcc/testsuite/gcc.dg/pr71969-2.c
> > +++ b/gcc/testsuite/gcc.dg/pr71969-2.c
> > @@ -20,4 +20,4 @@ main ()
> >    return 0;
> >  }
> >
> > -/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */
> > +/* { dg-final { scan-tree-dump-times "Inlining foo/\[0-9\]* into main/\[0-9\]*" 4 "einline" } } */
> > diff --git a/gcc/testsuite/gcc.dg/pr71969-3.c b/gcc/testsuite/gcc.dg/pr71969-3.c
> > index 583d89d..189adfd 100644
> > --- a/gcc/testsuite/gcc.dg/pr71969-3.c
> > +++ b/gcc/testsuite/gcc.dg/pr71969-3.c
> > @@ -35,4 +35,4 @@ main ()
> >  }
> >
> >  /* { dg-final { scan-tree-dump-times "will not early inline" 8 "einline" } } */
> > -/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */
> > +/* { dg-final { scan-tree-dump-times "Inlining foo/\[0-9\]* into main/\[0-9\]*" 4 "einline" } } */
> > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
> > index 6f0ff68..5673c32 100644
> > --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
> > +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
> > @@ -1,6 +1,6 @@
> >  /* { dg-do compile } */
> >  /* { dg-require-weak "" } */
> > -/* { dg-options "-O2 -fdump-tree-einline" } */
> > +/* { dg-options "-O2 -fdump-tree-einline-all" } */
> >  int w;
> >  int bar (void) __attribute__ ((weak));
> >  int bar (){
> > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
> > index 2998989..cd441af 100644
> > --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
> > +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=2" } */
> > +/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=2" } */
> >  /* { dg-add-options bind_pic_locally } */
> >
> >  extern void inlined ();
> > @@ -27,5 +27,5 @@ inline_me_too (void)
> >  {
> >    inlined();
> >  }
> > -/* { dg-final { scan-tree-dump-times "Inlining inline_me " 1 "einline"} } */
> > -/* { dg-final { scan-tree-dump-times "Inlining inline_me_too " 1 "einline"} } */
> > +/* { dg-final { scan-tree-dump-times "Inlining inline_me/\[0-9\]* " 1 "einline"} } */
> > +/* { dg-final { scan-tree-dump-times "Inlining inline_me_too/\[0-9\]* " 1 "einline"} } */
> > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
> > index c9f7978..93412fa 100644
> > --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
> > +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-O2 -fdump-tree-einline" } */
> > +/* { dg-options "-O2 -fdump-tree-einline-optimized -fopt-info-inline" } */
> >  /* { dg-add-options bind_pic_locally } */
> >
> >  extern int rand(void);
> > @@ -13,7 +13,7 @@ int my_id;
> >
> >  int main()
> >  {
> > -  int res = get_data_for (my_id);
> > +  int res = get_data_for (my_id); /* { dg-optimized "Inlining get_data_for/\[0-9\]+ into main/\[0-9\]+." } */
> >    switch (res)
> >      {
> >        case 0:
> > @@ -23,4 +23,4 @@ int main()
> >      }
> >  }
> >
> > -/* { dg-final { scan-tree-dump "Inlining get_data_for into main" "einline" } } */
> > +/* { dg-final { scan-tree-dump "Inlining get_data_for/\[0-9\]* into main/\[0-9\]*" "einline" } } */
> > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
> > index 6da886e..f87e0b5 100644
> > --- a/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
> > +++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-O -finline-small-functions --param early-inlining-insns=0 -fdump-tree-einline" } */
> > +/* { dg-options "-O -finline-small-functions --param early-inlining-insns=0 -fdump-tree-einline-optimized" } */
> >
> >  int foo0();
> >  void bar0() { foo0(); }
> > diff --git a/gcc/testsuite/gfortran.dg/pr79966.f90 b/gcc/testsuite/gfortran.dg/pr79966.f90
> > index eee43fb..2170afd 100644
> > --- a/gcc/testsuite/gfortran.dg/pr79966.f90
> > +++ b/gcc/testsuite/gfortran.dg/pr79966.f90
> > @@ -109,4 +109,4 @@ contains
> >    call RunTPTests()
> >    end program
> >
> > -! { dg-final { scan-ipa-dump "Inlined tp_sum into runtptests" "inline" } }
> > +! { dg-final { scan-ipa-dump "Inlined tp_sum/\[0-9\]+ into runtptests/\[0-9\]+" "inline" } }
> > diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
> > index 297fcd7..5ce319a 100644
> > --- a/gcc/tree-inline.c
> > +++ b/gcc/tree-inline.c
> > @@ -4673,14 +4673,20 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
> >    /* Add local vars in this inlined callee to caller.  */
> >    add_local_variables (id->src_cfun, cfun, id);
> >
> > -  if (dump_file && (dump_flags & TDF_DETAILS))
> > +  if (dump_enabled_p ())
> >      {
> > -      fprintf (dump_file, "Inlining %s to %s with frequency %4.2f\n",
> > -              id->src_node->dump_name (),
> > -              id->dst_node->dump_name (),
> > -              cg_edge->sreal_frequency ().to_double ());
> > -      id->src_node->dump (dump_file);
> > -      id->dst_node->dump (dump_file);
> > +      char buf[128];
> > +      snprintf (buf, sizeof(buf), "%4.2f",
> > +               cg_edge->sreal_frequency ().to_double ());
> > +      dump_printf_loc (MSG_NOTE | MSG_PRIORITY_INTERNALS,
> > +                      call_stmt,
> > +                      "Inlining %C to %C with frequency %s\n",
> > +                      id->src_node, id->dst_node, buf);
> > +      if (dump_file && (dump_flags & TDF_DETAILS))
> > +       {
> > +         id->src_node->dump (dump_file);
> > +         id->dst_node->dump (dump_file);
> > +       }
> >      }
> >
> >    /* This is it.  Duplicate the callee body.  Assume callee is
> > --
> > 1.8.5.3
> >

Patch

diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 055e8c4..97de735 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -14062,6 +14062,7 @@  instruction numbers for the links to the previous and next instructions
 in a sequence.
 
 @item -fdump-ipa-@var{switch}
+@itemx -fdump-ipa-@var{switch}-@var{options}
 @opindex fdump-ipa
 Control the dumping at various stages of inter-procedural analysis
 language tree to a file.  The file name is generated by appending a
@@ -14082,6 +14083,18 @@  Dump after function inlining.
 
 @end table
 
+Additionally, the options @option{-optimized}, @option{-missed},
+@option{-note}, and @option{-all} can be provided, with the same meaning
+as for @option{-fopt-info}, defaulting to @option{-optimized}.
+
+For example, @option{-fdump-ipa-inline-optimized-missed} will emit
+information on callsites that were inlined, along with callsites
+that were not inlined.
+
+By default, the dump will contain messages about successful
+optimizations (equivalent to @option {-optimized}) together with
+low-level details about the analysis.
+
 @item -fdump-lang-all
 @itemx -fdump-lang-@var{switch}
 @itemx -fdump-lang-@var{switch}-@var{options}
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 4f8ed15..8d0762d 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -227,20 +227,21 @@  caller_growth_limits (struct cgraph_edge *e)
 static void
 report_inline_failed_reason (struct cgraph_edge *e)
 {
-  if (dump_file)
+  if (dump_enabled_p ())
     {
-      fprintf (dump_file, "  not inlinable: %s -> %s, %s\n",
-	       e->caller->dump_name (),
-	       e->callee->dump_name (),
-	       cgraph_inline_failed_string (e->inline_failed));
+      dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+		       "  not inlinable: %C -> %C, %s\n",
+		       e->caller, e->callee,
+		       cgraph_inline_failed_string (e->inline_failed));
       if ((e->inline_failed == CIF_TARGET_OPTION_MISMATCH
 	   || e->inline_failed == CIF_OPTIMIZATION_MISMATCH)
 	  && e->caller->lto_file_data
 	  && e->callee->ultimate_alias_target ()->lto_file_data)
 	{
-	  fprintf (dump_file, "  LTO objects: %s, %s\n",
-		   e->caller->lto_file_data->file_name,
-		   e->callee->ultimate_alias_target ()->lto_file_data->file_name);
+	  dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			   "  LTO objects: %s, %s\n",
+			   e->caller->lto_file_data->file_name,
+			   e->callee->ultimate_alias_target ()->lto_file_data->file_name);
 	}
       if (e->inline_failed == CIF_TARGET_OPTION_MISMATCH)
 	cl_target_option_print_diff
@@ -569,8 +570,9 @@  can_early_inline_edge_p (struct cgraph_edge *e)
   if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->decl))
       || !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
     {
-      if (dump_file)
-	fprintf (dump_file, "  edge not inlinable: not in SSA form\n");
+      if (dump_enabled_p ())
+	dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			 "  edge not inlinable: not in SSA form\n");
       return false;
     }
   if (!can_inline_edge_p (e, true, true)
@@ -630,34 +632,34 @@  want_early_inline_function_p (struct cgraph_edge *e)
       else if (!e->maybe_hot_p ()
 	       && growth > 0)
 	{
-	  if (dump_file)
-	    fprintf (dump_file, "  will not early inline: %s->%s, "
-		     "call is cold and code would grow by %i\n",
-		     e->caller->dump_name (),
-		     callee->dump_name (),
-		     growth);
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "  will not early inline: %C->%C, "
+			     "call is cold and code would grow by %i\n",
+			     e->caller, callee,
+			     growth);
 	  want_inline = false;
 	}
       else if (growth > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
 	{
-	  if (dump_file)
-	    fprintf (dump_file, "  will not early inline: %s->%s, "
-		     "growth %i exceeds --param early-inlining-insns\n",
-		     e->caller->dump_name (),
-		     callee->dump_name (),
-		     growth);
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "  will not early inline: %C->%C, "
+			     "growth %i exceeds --param early-inlining-insns\n",
+			     e->caller, callee,
+			     growth);
 	  want_inline = false;
 	}
       else if ((n = num_calls (callee)) != 0
 	       && growth * (n + 1) > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
 	{
-	  if (dump_file)
-	    fprintf (dump_file, "  will not early inline: %s->%s, "
-		     "growth %i exceeds --param early-inlining-insns "
-		     "divided by number of calls\n",
-		     e->caller->dump_name (),
-		     callee->dump_name (),
-		     growth);
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "  will not early inline: %C->%C, "
+			     "growth %i exceeds --param early-inlining-insns "
+			     "divided by number of calls\n",
+			     e->caller, callee,
+			     growth);
 	  want_inline = false;
 	}
     }
@@ -936,8 +938,9 @@  want_inline_self_recursive_call_p (struct cgraph_edge *edge,
 	  want_inline = false;
 	}
     }
-  if (!want_inline && dump_file)
-    fprintf (dump_file, "   not inlining recursively: %s\n", reason);
+  if (!want_inline && dump_enabled_p ())
+    dump_printf_loc (MSG_MISSED_OPTIMIZATION, edge->call_stmt,
+		     "   not inlining recursively: %s\n", reason);
   return want_inline;
 }
 
@@ -1562,14 +1565,14 @@  recursive_inlining (struct cgraph_edge *edge,
   if (!master_clone)
     return false;
 
-  if (dump_file)
-    fprintf (dump_file,
-	     "\n   Inlined %i times, "
-	     "body grown from size %i to %i, time %f to %f\n", n,
-	     ipa_fn_summaries->get (master_clone)->size,
-	     ipa_fn_summaries->get (node)->size,
-	     ipa_fn_summaries->get (master_clone)->time.to_double (),
-	     ipa_fn_summaries->get (node)->time.to_double ());
+  if (dump_enabled_p ())
+    dump_printf_loc (MSG_NOTE, edge->call_stmt,
+		     "\n   Inlined %i times, "
+		     "body grown from size %i to %i, time %f to %f\n", n,
+		     ipa_fn_summaries->get (master_clone)->size,
+		     ipa_fn_summaries->get (node)->size,
+		     ipa_fn_summaries->get (master_clone)->time.to_double (),
+		     ipa_fn_summaries->get (node)->time.to_double ());
 
   /* Remove master clone we used for inlining.  We rely that clones inlined
      into master clone gets queued just before master clone so we don't
@@ -2078,17 +2081,20 @@  inline_small_functions (void)
 	update_callee_keys (&edge_heap, n, updated_nodes);
       bitmap_clear (updated_nodes);
 
-      if (dump_file)
+      if (dump_enabled_p ())
 	{
 	  ipa_fn_summary *s = ipa_fn_summaries->get (edge->caller);
-	  fprintf (dump_file,
-		   " Inlined %s into %s which now has time %f and size %i, "
-		   "net change of %+i.\n",
-		   xstrdup_for_dump (edge->callee->name ()),
-		   xstrdup_for_dump (edge->caller->name ()),
-		   s->time.to_double (),
-		   s->size,
-		   overall_size - old_size);
+
+	  /* dump_printf can't handle %+i.  */
+	  char buf_net_change[100];
+	  snprintf (buf_net_change, sizeof buf_net_change, "%+i",
+		    overall_size - old_size);
+
+	  dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, edge->call_stmt,
+			   " Inlined %C into %C which now has time %f and "
+			   "size %i, net change of %s.\n",
+			   edge->callee, edge->caller,
+			   s->time.to_double (), s->size, buf_net_change);
 	}
       if (min_size > overall_size)
 	{
@@ -2101,11 +2107,11 @@  inline_small_functions (void)
     }
 
   free_growth_caches ();
-  if (dump_file)
-    fprintf (dump_file,
-	     "Unit growth for small function inlining: %i->%i (%i%%)\n",
-	     initial_size, overall_size,
-	     initial_size ? overall_size * 100 / (initial_size) - 100: 0);
+  if (dump_enabled_p ())
+    dump_printf (MSG_NOTE,
+		 "Unit growth for small function inlining: %i->%i (%i%%)\n",
+		 initial_size, overall_size,
+		 initial_size ? overall_size * 100 / (initial_size) - 100: 0);
   symtab->remove_edge_removal_hook (edge_removal_hook_holder);
 }
 
@@ -2130,11 +2136,10 @@  flatten_function (struct cgraph_node *node, bool early)
       /* We've hit cycle?  It is time to give up.  */
       if (callee->aux)
 	{
-	  if (dump_file)
-	    fprintf (dump_file,
-		     "Not inlining %s into %s to avoid cycle.\n",
-		     xstrdup_for_dump (callee->name ()),
-		     xstrdup_for_dump (e->caller->name ()));
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "Not inlining %C into %C to avoid cycle.\n",
+			     callee, e->caller);
 	  if (cgraph_inline_failed_type (e->inline_failed) != CIF_FINAL_ERROR)
 	    e->inline_failed = CIF_RECURSIVE_INLINING;
 	  continue;
@@ -2159,25 +2164,27 @@  flatten_function (struct cgraph_node *node, bool early)
 
       if (e->recursive_p ())
 	{
-	  if (dump_file)
-	    fprintf (dump_file, "Not inlining: recursive call.\n");
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "Not inlining: recursive call.\n");
 	  continue;
 	}
 
       if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
 	  != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
 	{
-	  if (dump_file)
-	    fprintf (dump_file, "Not inlining: SSA form does not match.\n");
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "Not inlining: SSA form does not match.\n");
 	  continue;
 	}
 
       /* Inline the edge and flatten the inline clone.  Avoid
          recursing through the original node if the node was cloned.  */
-      if (dump_file)
-	fprintf (dump_file, " Inlining %s into %s.\n",
-		 xstrdup_for_dump (callee->name ()),
-		 xstrdup_for_dump (e->caller->name ()));
+      if (dump_enabled_p ())
+	dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
+			 " Inlining %C into %C.\n",
+			 callee, e->caller);
       orig_callee = callee;
       inline_call (e, true, NULL, NULL, false);
       if (e->callee != orig_callee)
@@ -2589,13 +2596,12 @@  ipa_inline (void)
   /* Free ipa-prop structures if they are no longer needed.  */
   ipa_free_all_structures_after_iinln ();
 
+  if (dump_enabled_p ())
+    dump_printf (MSG_NOTE,
+		 "\nInlined %i calls, eliminated %i functions\n\n",
+		 ncalls_inlined, nfunctions_inlined);
   if (dump_file)
-    {
-      fprintf (dump_file,
-	       "\nInlined %i calls, eliminated %i functions\n\n",
-	       ncalls_inlined, nfunctions_inlined);
-      dump_inline_stats ();
-    }
+    dump_inline_stats ();
 
   if (dump_file)
     ipa_dump_fn_summaries (dump_file);
@@ -2618,9 +2624,10 @@  inline_always_inline_functions (struct cgraph_node *node)
 
       if (e->recursive_p ())
 	{
-	  if (dump_file)
-	    fprintf (dump_file, "  Not inlining recursive call to %s.\n",
-		     e->callee->name ());
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "  Not inlining recursive call to %C.\n",
+			     e->callee);
 	  e->inline_failed = CIF_RECURSIVE_INLINING;
 	  continue;
 	}
@@ -2636,10 +2643,10 @@  inline_always_inline_functions (struct cgraph_node *node)
 	  continue;
 	}
 
-      if (dump_file)
-	fprintf (dump_file, "  Inlining %s into %s (always_inline).\n",
-		 xstrdup_for_dump (e->callee->name ()),
-		 xstrdup_for_dump (e->caller->name ()));
+      if (dump_enabled_p ())
+	dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
+			 "  Inlining %C into %C (always_inline).\n",
+			 e->callee, e->caller);
       inline_call (e, true, NULL, NULL, false);
       inlined = true;
     }
@@ -2675,27 +2682,29 @@  early_inline_small_functions (struct cgraph_node *node)
 	  && !opt_for_fn (node->decl, flag_inline_functions))
 	continue;
 
-      if (dump_file)
-	fprintf (dump_file, "Considering inline candidate %s.\n",
-		 callee->name ());
+      if (dump_enabled_p ())
+	dump_printf_loc (MSG_NOTE, e->call_stmt,
+			 "Considering inline candidate %C.\n",
+			 callee);
 
       if (!can_early_inline_edge_p (e))
 	continue;
 
       if (e->recursive_p ())
 	{
-	  if (dump_file)
-	    fprintf (dump_file, "  Not inlining: recursive call.\n");
+	  if (dump_enabled_p ())
+	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, e->call_stmt,
+			     "  Not inlining: recursive call.\n");
 	  continue;
 	}
 
       if (!want_early_inline_function_p (e))
 	continue;
 
-      if (dump_file)
-	fprintf (dump_file, " Inlining %s into %s.\n",
-		 xstrdup_for_dump (callee->name ()),
-		 xstrdup_for_dump (e->caller->name ()));
+      if (dump_enabled_p ())
+	dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, e->call_stmt,
+			 " Inlining %C into %C.\n",
+			 callee, e->caller);
       inline_call (e, true, NULL, NULL, false);
       inlined = true;
     }
@@ -2755,9 +2764,9 @@  early_inliner (function *fun)
     {
       /* When the function is marked to be flattened, recursively inline
 	 all calls in it.  */
-      if (dump_file)
-	fprintf (dump_file,
-		 "Flattening %s\n", node->name ());
+      if (dump_enabled_p ())
+	dump_printf (MSG_OPTIMIZED_LOCATIONS,
+		     "Flattening %C\n", node);
       flatten_function (node, true);
       inlined = true;
     }
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-12.C b/gcc/testsuite/g++.dg/ipa/devirt-12.C
index 93ce251..60271a0 100644
--- a/gcc/testsuite/g++.dg/ipa/devirt-12.C
+++ b/gcc/testsuite/g++.dg/ipa/devirt-12.C
@@ -1,5 +1,5 @@ 
 // { dg-do compile { target c++11 } }
-// { dg-options "-O -fdump-ipa-inline" }
+// { dg-options "-O -fdump-ipa-inline-all" }
 
 class Foo
 {
diff --git a/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C b/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
index 37b7d87..00ac61e7 100644
--- a/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
+++ b/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C
@@ -1,7 +1,7 @@ 
 /* Verify that virtual calls are folded even early inlining puts them into one
    function with the definition.  */
 /* { dg-do run } */
-/* { dg-options "-O2 -fdump-tree-einline"  } */
+/* { dg-options "-O2 -fdump-tree-einline-optimized"  } */
 
 extern "C" void abort (void);
 
diff --git a/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
index 2156cec..b65d915 100644
--- a/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
+++ b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C
@@ -1,4 +1,4 @@ 
-/* { dg-options "-O2 -fdump-tree-einline" } */
+/* { dg-options "-O2 -fdump-tree-einline-all" } */
 class DocId {
  public:
  DocId() { }
diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
index 4497fac..9c49ddb 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
+/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=3" } */
 /* { dg-add-options bind_pic_locally } */
 
 namespace std {
diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
index 79f807c..b72f652 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=3" } */
+/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=3" } */
 /* { dg-add-options bind_pic_locally } */
 
 namespace std {
diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
index 0ad366e..131f12d 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=5" } */
+/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=5" } */
 /* { dg-add-options bind_pic_locally } */
 
 #include <algorithm>
diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-4.C b/gcc/testsuite/g++.dg/tree-ssa/inline-4.C
new file mode 100644
index 0000000..1dd8140
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/inline-4.C
@@ -0,0 +1,32 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -fopt-info-inline --param max-early-inliner-iterations=3" } */
+/* { dg-add-options bind_pic_locally } */
+
+namespace std {
+  extern "C" int puts(const char *s);
+}
+
+template <class T, class E> void
+foreach (T b, T e, void (*ptr)(E))
+{
+  for (; b != e; b++)
+    ptr(*b); // { dg-optimized "Inlining void inline_me\[^\\n\]* into int main\[^\\n\]*" }
+}
+
+void
+inline_me (char *x)
+{
+  std::puts(x); 
+}
+
+static void
+inline_me_too (char *x)
+{
+  std::puts(x);
+}
+
+int main(int argc, char **argv)
+{
+  foreach (argv, argv + argc, inline_me); // { dg-optimized "Inlining void foreach\[^\\n\]* into int main\[^\\n\]*" }
+  foreach (argv, argv + argc, inline_me_too); // { dg-optimized "Inlining void foreach\[^\\n\]* into int main\[^\\n\]*" }
+}
diff --git a/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c b/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
new file mode 100644
index 0000000..4032ad1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/fopt-info-inline-1.c
@@ -0,0 +1,44 @@ 
+/* { dg-options "-O3 -fopt-info-inline-optimized-missed" } */
+
+static int foo (int a)
+{
+  return a + 10;
+}
+
+static int bar (int b)
+{
+  return b - 20;
+}
+
+static int boo (int a, int b)
+{
+  return (foo (a)     /* { dg-optimized "Inlining foo/\[0-9\]+ into boo/\[0-9\]+" } */
+	  + bar (b)); /* { dg-optimized "Inlining bar/\[0-9\]+ into boo/\[0-9\]+" } */
+}
+
+extern int v_a, v_b;
+extern int result;
+
+int compute ()
+{
+  result = boo (v_a, v_b); /* { dg-optimized "Inlining boo/\[0-9\]+ into compute/\[0-9\]+" } */
+
+  return result;
+}
+
+extern void not_available(int);
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+  return 1;
+}
+
+int test_1 ()
+{
+  return get_input (); /* { dg-missed "not inlinable: test_1/\[0-9\]+ -> get_input/\[0-9\]+, function not inlinable" } */
+}
+
+void test_2 (int v)
+{
+  not_available (1); /* { dg-missed "not inlinable: test_2/\[0-9\]+ -> not_available/\[0-9\]+, function body not available" } */
+}
diff --git a/gcc/testsuite/gcc.dg/ipa/inline-4.c b/gcc/testsuite/gcc.dg/ipa/inline-4.c
index fdb4465..db4cfc6 100644
--- a/gcc/testsuite/gcc.dg/ipa/inline-4.c
+++ b/gcc/testsuite/gcc.dg/ipa/inline-4.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-Os -c -fdump-ipa-inline -fno-early-inlining -fno-partial-inlining -fno-ipa-cp"  } */
+/* { dg-options "-Os -c -fdump-ipa-inline-all -fopt-info-inline -fno-early-inlining -fno-partial-inlining -fno-ipa-cp"  } */
 /* { dg-add-options bind_pic_locally } */
 
 void work_hard (void);
@@ -20,7 +20,7 @@  void do_something (int shall_i_work)
 }
 int foo (int invariant)
 {
-  do_something (0);
+  do_something (0); // { dg-optimized "Inlined do_something/\[0-9]+ into foo/\[0-9]+" }
   do_something (1);
 }
 
diff --git a/gcc/testsuite/gcc.dg/ipa/inline-7.c b/gcc/testsuite/gcc.dg/ipa/inline-7.c
index 5002aa0..7dabb14 100644
--- a/gcc/testsuite/gcc.dg/ipa/inline-7.c
+++ b/gcc/testsuite/gcc.dg/ipa/inline-7.c
@@ -1,6 +1,6 @@ 
 /* Check that early inliner works out that a is empty of parameter 0.  */
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline -fno-partial-inlining"  } */
+/* { dg-options "-O2 -fdump-tree-einline-optimized -fopt-info-inline -fno-partial-inlining"  } */
 void t(void);
 int a (int b)
 {
@@ -18,7 +18,7 @@  int a (int b)
 void
 m()
 {
- a(1);
+ a(1); /* { dg-optimized "Inlining a/\[0-9\]* into m/\[0-9\]*" } */
  a(0);
 }
-/* { dg-final { scan-tree-dump-times "Inlining a into m" 1 "einline"  } } */
+/* { dg-final { scan-tree-dump-times "Inlining a.* into m.*" 1 "einline"  } } */
diff --git a/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c b/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
index 656260a..ecb9a29 100644
--- a/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
+++ b/gcc/testsuite/gcc.dg/ipa/inlinehint-4.c
@@ -35,5 +35,5 @@  test (int i)
     lookup (9 * i);
 }
 /* { dg-final { scan-ipa-dump "Wrapper penalty"  "inline"  } } */
-/* { dg-final { scan-ipa-dump-not "Inlined lookup_slow into lookup"  "inline"  } } */
-/* { dg-final { scan-ipa-dump "Inlined lookup into test"  "inline"  } } */
+/* { dg-final { scan-ipa-dump-not "Inlined lookup_slow/\[0-9\]* into lookup/\[0-9\]*"  "inline"  } } */
+/* { dg-final { scan-ipa-dump "Inlined lookup/\[0-9\]* into test/\[0-9\]*"  "inline"  } } */
diff --git a/gcc/testsuite/gcc.dg/plugin/dump-1.c b/gcc/testsuite/gcc.dg/plugin/dump-1.c
index 95bd7a4..1538bf6 100644
--- a/gcc/testsuite/gcc.dg/plugin/dump-1.c
+++ b/gcc/testsuite/gcc.dg/plugin/dump-1.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-fopt-info-note" } */
+/* { dg-options "-fopt-info-loop-note" } */
 
 extern void test_string_literal (void);
 extern void test_tree (void);
diff --git a/gcc/testsuite/gcc.dg/plugin/dump-2.c b/gcc/testsuite/gcc.dg/plugin/dump-2.c
index 961a3d3..04b82e5 100644
--- a/gcc/testsuite/gcc.dg/plugin/dump-2.c
+++ b/gcc/testsuite/gcc.dg/plugin/dump-2.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-fopt-info-note-internals" } */
+/* { dg-options "-fopt-info-loop-note-internals" } */
 
 extern void test_string_literal (void);
 extern void test_tree (void);
diff --git a/gcc/testsuite/gcc.dg/pr26570.c b/gcc/testsuite/gcc.dg/pr26570.c
index 87b644a..d29bc35 100644
--- a/gcc/testsuite/gcc.dg/pr26570.c
+++ b/gcc/testsuite/gcc.dg/pr26570.c
@@ -6,3 +6,4 @@  unsigned test (unsigned a, unsigned b)
 {
   return a / b;
 } /* { dg-missed "\[^\n\]*execution counts estimated" } */
+/* { dg-prune-output "function body not available" } */
diff --git a/gcc/testsuite/gcc.dg/pr71969-2.c b/gcc/testsuite/gcc.dg/pr71969-2.c
index f434fd0..73839a6 100644
--- a/gcc/testsuite/gcc.dg/pr71969-2.c
+++ b/gcc/testsuite/gcc.dg/pr71969-2.c
@@ -20,4 +20,4 @@  main ()
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */
+/* { dg-final { scan-tree-dump-times "Inlining foo/\[0-9\]* into main/\[0-9\]*" 4 "einline" } } */
diff --git a/gcc/testsuite/gcc.dg/pr71969-3.c b/gcc/testsuite/gcc.dg/pr71969-3.c
index 583d89d..189adfd 100644
--- a/gcc/testsuite/gcc.dg/pr71969-3.c
+++ b/gcc/testsuite/gcc.dg/pr71969-3.c
@@ -35,4 +35,4 @@  main ()
 }
 
 /* { dg-final { scan-tree-dump-times "will not early inline" 8 "einline" } } */
-/* { dg-final { scan-tree-dump-times "Inlining foo into main" 4 "einline" } } */
+/* { dg-final { scan-tree-dump-times "Inlining foo/\[0-9\]* into main/\[0-9\]*" 4 "einline" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
index 6f0ff68..5673c32 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-11.c
@@ -1,6 +1,6 @@ 
 /* { dg-do compile } */
 /* { dg-require-weak "" } */
-/* { dg-options "-O2 -fdump-tree-einline" } */
+/* { dg-options "-O2 -fdump-tree-einline-all" } */
 int w;
 int bar (void) __attribute__ ((weak));
 int bar (){
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
index 2998989..cd441af 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-3.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline --param max-early-inliner-iterations=2" } */
+/* { dg-options "-O2 -fdump-tree-einline-optimized --param max-early-inliner-iterations=2" } */
 /* { dg-add-options bind_pic_locally } */
 
 extern void inlined ();
@@ -27,5 +27,5 @@  inline_me_too (void)
 {
   inlined();
 }
-/* { dg-final { scan-tree-dump-times "Inlining inline_me " 1 "einline"} } */
-/* { dg-final { scan-tree-dump-times "Inlining inline_me_too " 1 "einline"} } */
+/* { dg-final { scan-tree-dump-times "Inlining inline_me/\[0-9\]* " 1 "einline"} } */
+/* { dg-final { scan-tree-dump-times "Inlining inline_me_too/\[0-9\]* " 1 "einline"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
index c9f7978..93412fa 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-4.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-einline" } */
+/* { dg-options "-O2 -fdump-tree-einline-optimized -fopt-info-inline" } */
 /* { dg-add-options bind_pic_locally } */
 
 extern int rand(void);
@@ -13,7 +13,7 @@  int my_id;
 
 int main()
 {
-  int res = get_data_for (my_id);
+  int res = get_data_for (my_id); /* { dg-optimized "Inlining get_data_for/\[0-9\]+ into main/\[0-9\]+." } */
   switch (res)
     {
       case 0:
@@ -23,4 +23,4 @@  int main()
     }
 }
 
-/* { dg-final { scan-tree-dump "Inlining get_data_for into main" "einline" } } */
+/* { dg-final { scan-tree-dump "Inlining get_data_for/\[0-9\]* into main/\[0-9\]*" "einline" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c b/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
index 6da886e..f87e0b5 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/inline-8.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O -finline-small-functions --param early-inlining-insns=0 -fdump-tree-einline" } */
+/* { dg-options "-O -finline-small-functions --param early-inlining-insns=0 -fdump-tree-einline-optimized" } */
 
 int foo0();
 void bar0() { foo0(); }
diff --git a/gcc/testsuite/gfortran.dg/pr79966.f90 b/gcc/testsuite/gfortran.dg/pr79966.f90
index eee43fb..2170afd 100644
--- a/gcc/testsuite/gfortran.dg/pr79966.f90
+++ b/gcc/testsuite/gfortran.dg/pr79966.f90
@@ -109,4 +109,4 @@  contains
   call RunTPTests()
   end program
 
-! { dg-final { scan-ipa-dump "Inlined tp_sum into runtptests" "inline" } }
+! { dg-final { scan-ipa-dump "Inlined tp_sum/\[0-9\]+ into runtptests/\[0-9\]+" "inline" } }
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 297fcd7..5ce319a 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -4673,14 +4673,20 @@  expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id)
   /* Add local vars in this inlined callee to caller.  */
   add_local_variables (id->src_cfun, cfun, id);
 
-  if (dump_file && (dump_flags & TDF_DETAILS))
+  if (dump_enabled_p ())
     {
-      fprintf (dump_file, "Inlining %s to %s with frequency %4.2f\n",
-	       id->src_node->dump_name (),
-	       id->dst_node->dump_name (),
-	       cg_edge->sreal_frequency ().to_double ());
-      id->src_node->dump (dump_file);
-      id->dst_node->dump (dump_file);
+      char buf[128];
+      snprintf (buf, sizeof(buf), "%4.2f",
+		cg_edge->sreal_frequency ().to_double ());
+      dump_printf_loc (MSG_NOTE | MSG_PRIORITY_INTERNALS,
+		       call_stmt,
+		       "Inlining %C to %C with frequency %s\n",
+		       id->src_node, id->dst_node, buf);
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	{
+	  id->src_node->dump (dump_file);
+	  id->dst_node->dump (dump_file);
+	}
     }
 
   /* This is it.  Duplicate the callee body.  Assume callee is