Commit 4174a33a by David Malcolm Committed by David Malcolm

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

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 focussed 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.

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.

From-SVN: r265920
parent 204839e7
2018-11-08 David Malcolm <dmalcolm@redhat.com>
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.
2018-11-08 David Malcolm <dmalcolm@redhat.com>
* pretty-print.c (pp_format): Handle %f.
(selftest::test_pp_format): Add test of %f.
* pretty-print.h (pp_double): New macro.
......@@ -14085,6 +14085,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
......@@ -14105,6 +14106,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}
2018-11-08 David Malcolm <dmalcolm@redhat.com>
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.
2018-11-08 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/format/gcc_diag-10.c: Add coverage for %f.
2018-11-08 David Malcolm <dmalcolm@redhat.com>
......
// { dg-do compile { target c++11 } }
// { dg-options "-O -fdump-ipa-inline" }
// { dg-options "-O -fdump-ipa-inline-all" }
class Foo
{
......
/* 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);
......
/* { dg-options "-O2 -fdump-tree-einline" } */
/* { dg-options "-O2 -fdump-tree-einline-all" } */
class DocId {
public:
DocId() { }
......
/* { 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 {
......
/* { 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 {
......
/* { 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>
......
/* { 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\]*" }
}
/* { 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" } */
}
/* { 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);
}
......
/* 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" } } */
......@@ -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" } } */
/* { 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);
......
/* { 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);
......
......@@ -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" } */
......@@ -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" } } */
......@@ -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" } } */
/* { 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 (){
......
/* { 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"} } */
/* { 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" } } */
/* { 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(); }
......
......@@ -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" } }
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment