Message ID | 1541610522-56777-5-git-send-email-dmalcolm@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fix -fopt-info-inline (PR ipa/86395) | expand |
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 >
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 > >
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