* Ipa function summary pass
@ 2017-05-23 16:23 Jan Hubicka
2017-05-24 8:52 ` Christophe Lyon
0 siblings, 1 reply; 3+ messages in thread
From: Jan Hubicka @ 2017-05-23 16:23 UTC (permalink / raw)
To: gcc-patches
Hi,
this patch finishes the breakup of ipa-inline and function analysis.
The analysis is now done by separate pass and I will work on cleaning
up the interfaces now.
Honza
* cgraphunit.c (symbol_table::process_new_functions): Update.
* ipa-fnsummary.c (pass_data_inline_parameters): Remove.
(inline_generate_summary): Rename to ...
(ipa_fn_summary_generate): ... this one.
(inline_read_summary): Rename to ...
(ipa_fn_summary_read): ... this one.
(inline_write_summary): Rename to ...
(ipa_fn_summary_write): ... this one.
(inline_free_summary): Rename to ...
(ipa_free_fn_summary): ... this one.
(pass_data_local_fn_summary, pass_local_fn_summary,
make_pass_local_fn_summary, pass_data_ipa_free_fn_summary,
pass_ipa_free_fn_summary, make_pass_ipa_free_fn_summary,
pass_data_ipa_fn_summary, pass_ipa_fn_summary,
make_pass_ipa_fn_summary): New.
* ipa-fnsummary.h (inline_generate_summary, inline_read_summary,
inline_write_summary, inline_free_summary): Remove.
(ipa_free_fn_summary) : New.
* ipa-inline.c (ipa_inline): Update.
(pass_ipa_inline): Do not generate summaries.
* ipa.c (pass_data_ipa_free_fn_summary, pass_ipa_free_fn_summary):
Remove.
* passes.def: Replace pass_inline_parameters by pass_local_fn_summary
and add pass_ipa_fn_summary.
* tree-pass.h (make_pass_ipa_fn_summary, make_pass_local_fn_summary):
New.
(make_pass_inline_parameters): Remove.
* lto.c (do_whole_program_analysis): Replace inline_free_summary
by ipa_free_fn_summary.
* gcc.dg/ipa/ctor-empty-1.c: Update template.
* gcc.dg/ipa/inline-5.c: Likewise.
* gfortran.dg/pr48636.f90: Likewise.
Index: cgraphunit.c
===================================================================
--- cgraphunit.c (revision 248365)
+++ cgraphunit.c (working copy)
@@ -339,7 +339,7 @@ symbol_table::process_new_functions (voi
and splitting. This is redundant for functions added late.
Just throw away whatever it did. */
if (!summaried_computed)
- inline_free_summary ();
+ ipa_free_fn_summary ();
}
else if (ipa_fn_summaries != NULL)
compute_fn_summary (node, true);
Index: ipa-fnsummary.c
===================================================================
--- ipa-fnsummary.c (revision 248366)
+++ ipa-fnsummary.c (working copy)
@@ -2504,46 +2504,6 @@ compute_fn_summary_for_current (void)
return 0;
}
-namespace {
-
-const pass_data pass_data_inline_parameters =
-{
- GIMPLE_PASS, /* type */
- "inline_param", /* name */
- OPTGROUP_INLINE, /* optinfo_flags */
- TV_INLINE_PARAMETERS, /* tv_id */
- 0, /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- 0, /* todo_flags_finish */
-};
-
-class pass_inline_parameters : public gimple_opt_pass
-{
-public:
- pass_inline_parameters (gcc::context *ctxt)
- : gimple_opt_pass (pass_data_inline_parameters, ctxt)
- {}
-
- /* opt_pass methods: */
- opt_pass * clone () { return new pass_inline_parameters (m_ctxt); }
- virtual unsigned int execute (function *)
- {
- return compute_fn_summary_for_current ();
- }
-
-}; // class pass_inline_parameters
-
-} // anon namespace
-
-gimple_opt_pass *
-make_pass_inline_parameters (gcc::context *ctxt)
-{
- return new pass_inline_parameters (ctxt);
-}
-
-
/* Estimate benefit devirtualizing indirect edge IE, provided KNOWN_VALS,
KNOWN_CONTEXTS and KNOWN_AGGS. */
@@ -3207,8 +3167,8 @@ ipa_fn_summary_t::insert (struct cgraph_
/* Note function body size. */
-void
-inline_generate_summary (void)
+static void
+ipa_fn_summary_generate (void)
{
struct cgraph_node *node;
@@ -3226,7 +3186,7 @@ inline_generate_summary (void)
ipa_fn_summaries->enable_insertion_hook ();
ipa_register_cgraph_hooks ();
- inline_free_summary ();
+ ipa_free_fn_summary ();
FOR_EACH_DEFINED_FUNCTION (node)
if (!node->alias)
@@ -3358,8 +3318,8 @@ inline_read_section (struct lto_file_dec
and inliner, so when ipa-cp is active, we don't need to write them
twice. */
-void
-inline_read_summary (void)
+static void
+ipa_fn_summary_read (void)
{
struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
struct lto_file_decl_data *file_data;
@@ -3419,8 +3379,8 @@ write_ipa_call_summary (struct output_bl
Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
active, we don't need to write them twice. */
-void
-inline_write_summary (void)
+static void
+ipa_fn_summary_write (void)
{
struct output_block *ob = create_output_block (LTO_section_ipa_fn_summary);
lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
@@ -3510,7 +3470,7 @@ inline_write_summary (void)
/* Release inline summary. */
void
-inline_free_summary (void)
+ipa_free_fn_summary (void)
{
struct cgraph_node *node;
if (!ipa_call_summaries)
@@ -3525,3 +3485,131 @@ inline_free_summary (void)
ipa_call_summaries = NULL;
edge_predicate_pool.release ();
}
+
+namespace {
+
+const pass_data pass_data_local_fn_summary =
+{
+ GIMPLE_PASS, /* type */
+ "local-fnsummary", /* name */
+ OPTGROUP_INLINE, /* optinfo_flags */
+ TV_INLINE_PARAMETERS, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ 0, /* todo_flags_finish */
+};
+
+class pass_local_fn_summary : public gimple_opt_pass
+{
+public:
+ pass_local_fn_summary (gcc::context *ctxt)
+ : gimple_opt_pass (pass_data_local_fn_summary, ctxt)
+ {}
+
+ /* opt_pass methods: */
+ opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
+ virtual unsigned int execute (function *)
+ {
+ return compute_fn_summary_for_current ();
+ }
+
+}; // class pass_local_fn_summary
+
+} // anon namespace
+
+gimple_opt_pass *
+make_pass_local_fn_summary (gcc::context *ctxt)
+{
+ return new pass_local_fn_summary (ctxt);
+}
+
+
+/* Free inline summary. */
+
+namespace {
+
+const pass_data pass_data_ipa_free_fn_summary =
+{
+ SIMPLE_IPA_PASS, /* type */
+ "free-fnsummary", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
+ TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ /* Early optimizations may make function unreachable. We can not
+ remove unreachable functions as part of the ealry opts pass because
+ TODOs are run before subpasses. Do it here. */
+ ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
+};
+
+class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
+{
+public:
+ pass_ipa_free_fn_summary (gcc::context *ctxt)
+ : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt)
+ {}
+
+ /* opt_pass methods: */
+ virtual unsigned int execute (function *)
+ {
+ ipa_free_fn_summary ();
+ return 0;
+ }
+
+}; // class pass_ipa_free_fn_summary
+
+} // anon namespace
+
+simple_ipa_opt_pass *
+make_pass_ipa_free_fn_summary (gcc::context *ctxt)
+{
+ return new pass_ipa_free_fn_summary (ctxt);
+}
+
+namespace {
+
+const pass_data pass_data_ipa_fn_summary =
+{
+ IPA_PASS, /* type */
+ "fnsummary", /* name */
+ OPTGROUP_INLINE, /* optinfo_flags */
+ TV_IPA_INLINING, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ ( TODO_dump_symtab ), /* todo_flags_finish */
+};
+
+class pass_ipa_fn_summary : public ipa_opt_pass_d
+{
+public:
+ pass_ipa_fn_summary (gcc::context *ctxt)
+ : ipa_opt_pass_d (pass_data_ipa_fn_summary, ctxt,
+ ipa_fn_summary_generate, /* generate_summary */
+ ipa_fn_summary_write, /* write_summary */
+ ipa_fn_summary_read, /* read_summary */
+ NULL, /* write_optimization_summary */
+ NULL, /* read_optimization_summary */
+ NULL, /* stmt_fixup */
+ 0, /* function_transform_todo_flags_start */
+ NULL, /* function_transform */
+ NULL) /* variable_transform */
+ {}
+
+ /* opt_pass methods: */
+ virtual unsigned int execute (function *) { return 0; }
+
+}; // class pass_ipa_fn_summary
+
+} // anon namespace
+
+ipa_opt_pass_d *
+make_pass_ipa_fn_summary (gcc::context *ctxt)
+{
+ return new pass_ipa_fn_summary (ctxt);
+}
Index: ipa-fnsummary.h
===================================================================
--- ipa-fnsummary.h (revision 248365)
+++ ipa-fnsummary.h (working copy)
@@ -231,10 +231,7 @@ void ipa_debug_fn_summary (struct cgraph
void ipa_dump_fn_summaries (FILE *f);
void ipa_dump_fn_summary (FILE *f, struct cgraph_node *node);
void ipa_dump_hints (FILE *f, ipa_hints);
-void inline_generate_summary (void);
-void inline_read_summary (void);
-void inline_write_summary (void);
-void inline_free_summary (void);
+void ipa_free_fn_summary (void);
void inline_analyze_function (struct cgraph_node *node);
void estimate_ipcp_clone_size_and_time (struct cgraph_node *,
vec<tree>,
Index: ipa-inline.c
===================================================================
--- ipa-inline.c (revision 248365)
+++ ipa-inline.c (working copy)
@@ -2513,7 +2513,7 @@ ipa_inline (void)
ipa_dump_fn_summaries (dump_file);
/* In WPA we use inline summaries for partitioning process. */
if (!flag_wpa)
- inline_free_summary ();
+ ipa_free_fn_summary ();
return remove_functions ? TODO_remove_functions : 0;
}
@@ -2819,9 +2819,9 @@ class pass_ipa_inline : public ipa_opt_p
public:
pass_ipa_inline (gcc::context *ctxt)
: ipa_opt_pass_d (pass_data_ipa_inline, ctxt,
- inline_generate_summary, /* generate_summary */
- inline_write_summary, /* write_summary */
- inline_read_summary, /* read_summary */
+ NULL, /* generate_summary */
+ NULL, /* write_summary */
+ NULL, /* read_summary */
NULL, /* write_optimization_summary */
NULL, /* read_optimization_summary */
NULL, /* stmt_fixup */
Index: ipa.c
===================================================================
--- ipa.c (revision 248365)
+++ ipa.c (working copy)
@@ -845,50 +845,6 @@ ipa_discover_readonly_nonaddressable_var
return remove_p;
}
-/* Free inline summary. */
-
-namespace {
-
-const pass_data pass_data_ipa_free_fn_summary =
-{
- SIMPLE_IPA_PASS, /* type */
- "free-inline-summary", /* name */
- OPTGROUP_NONE, /* optinfo_flags */
- TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
- 0, /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- /* Early optimizations may make function unreachable. We can not
- remove unreachable functions as part of the ealry opts pass because
- TODOs are run before subpasses. Do it here. */
- ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
-};
-
-class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
-{
-public:
- pass_ipa_free_fn_summary (gcc::context *ctxt)
- : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt)
- {}
-
- /* opt_pass methods: */
- virtual unsigned int execute (function *)
- {
- inline_free_summary ();
- return 0;
- }
-
-}; // class pass_ipa_free_fn_summary
-
-} // anon namespace
-
-simple_ipa_opt_pass *
-make_pass_ipa_free_fn_summary (gcc::context *ctxt)
-{
- return new pass_ipa_free_fn_summary (ctxt);
-}
-
/* Generate and emit a static constructor or destructor. WHICH must
be one of 'I' (for a constructor), 'D' (for a destructor), 'P'
(for chp static vars constructor) or 'B' (for chkp static bounds
Index: lto/lto.c
===================================================================
--- lto/lto.c (revision 248336)
+++ lto/lto.c (working copy)
@@ -3129,7 +3129,7 @@ do_whole_program_analysis (void)
/* Inline summaries are needed for balanced partitioning. Free them now so
the memory can be used for streamer caches. */
- inline_free_summary ();
+ ipa_free_fn_summary ();
/* AUX pointers are used by partitioning code to bookkeep number of
partitions symbol is in. This is no longer needed. */
Index: passes.def
===================================================================
--- passes.def (revision 248365)
+++ passes.def (working copy)
@@ -75,7 +75,7 @@ along with GCC; see the file COPYING3.
PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes)
NEXT_PASS (pass_fixup_cfg);
NEXT_PASS (pass_rebuild_cgraph_edges);
- NEXT_PASS (pass_inline_parameters);
+ NEXT_PASS (pass_local_fn_summary);
NEXT_PASS (pass_early_inline);
NEXT_PASS (pass_all_early_optimizations);
PUSH_INSERT_PASSES_WITHIN (pass_all_early_optimizations)
@@ -110,7 +110,7 @@ along with GCC; see the file COPYING3.
POP_INSERT_PASSES ()
NEXT_PASS (pass_release_ssa_names);
NEXT_PASS (pass_rebuild_cgraph_edges);
- NEXT_PASS (pass_inline_parameters);
+ NEXT_PASS (pass_local_fn_summary);
POP_INSERT_PASSES ()
NEXT_PASS (pass_ipa_oacc);
@@ -157,6 +157,7 @@ along with GCC; see the file COPYING3.
NEXT_PASS (pass_ipa_cp);
NEXT_PASS (pass_ipa_cdtor_merge);
NEXT_PASS (pass_ipa_hsa);
+ NEXT_PASS (pass_ipa_fn_summary);
NEXT_PASS (pass_ipa_inline);
NEXT_PASS (pass_ipa_pure_const);
NEXT_PASS (pass_ipa_reference);
Index: tree-pass.h
===================================================================
--- tree-pass.h (revision 248365)
+++ tree-pass.h (working copy)
@@ -494,6 +494,7 @@ extern ipa_opt_pass_d *make_pass_ipa_who
*ctxt);
extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
*ctxt);
+extern ipa_opt_pass_d *make_pass_ipa_fn_summary (gcc::context *ctxt);
extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
extern simple_ipa_opt_pass *make_pass_ipa_free_fn_summary (gcc::context *ctxt);
@@ -617,7 +618,7 @@ extern rtl_opt_pass *make_pass_final (gc
extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_inline_parameters (gcc::context *ctxt);
+extern gimple_opt_pass *make_pass_local_fn_summary (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
Index: gcc.dg/ipa/ctor-empty-1.c
===================================================================
--- gcc.dg/ipa/ctor-empty-1.c (revision 248374)
+++ gcc.dg/ipa/ctor-empty-1.c (working copy)
@@ -1,7 +1,7 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -c -fdump-ipa-free-inline-summary" } */
+/* { dg-options "-O3 -c -fdump-ipa-free-fnsummary" } */
static __attribute__((constructor))
void empty_constructor()
{
}
-/* { dg-final { scan-ipa-dump "Reclaiming functions: empty_constructor" "free-inline-summary" } } */
+/* { dg-final { scan-ipa-dump "Reclaiming functions: empty_constructor" "free-fnsummary" } } */
Index: gcc.dg/ipa/inline-5.c
===================================================================
--- gcc.dg/ipa/inline-5.c (revision 248374)
+++ gcc.dg/ipa/inline-5.c (working copy)
@@ -1,6 +1,6 @@
/* Check statements that are eliminated by inlining. */
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-ipa-inline-details -fno-early-inlining -fno-partial-inlining -fno-ipa-cp" } */
+/* { dg-options "-O2 -fdump-ipa-fnsummary-details -fno-early-inlining -fno-partial-inlining -fno-ipa-cp" } */
struct a {int a,b,c,d,e;};
void t(int);
@@ -34,5 +34,5 @@ accessreference (struct a *a)
/* Will be eliminated by inlining */
}
-/* { dg-final { scan-ipa-dump-times "Will be eliminated" 4 "inline" { xfail { { hppa*-*-* } && { ! lp64 } } } } } */
-/* { dg-final { scan-ipa-dump-times "50. will be eliminated" 1 "inline" } } */
+/* { dg-final { scan-ipa-dump-times "Will be eliminated" 4 "fnsummary" { xfail { { hppa*-*-* } && { ! lp64 } } } } } */
+/* { dg-final { scan-ipa-dump-times "50. will be eliminated" 1 "fnsummary" } } */
Index: gfortran.dg/pr48636.f90
===================================================================
--- gfortran.dg/pr48636.f90 (revision 248374)
+++ gfortran.dg/pr48636.f90 (working copy)
@@ -1,5 +1,5 @@
! { dg-do compile }
-! { dg-options "-O3 -fdump-ipa-inline-details -fno-ipa-cp" }
+! { dg-options "-O3 -fdump-ipa-inline-details -fdump-ipa-fnsummary-details -fno-ipa-cp" }
module foo
implicit none
@@ -34,5 +34,5 @@ program main
end program main
! { dg-final { scan-ipa-dump "bar\[^\\n\]*inline copy in MAIN" "inline" } }
-! { dg-final { scan-ipa-dump-times "phi predicate:" 3 "inline" } }
-! { dg-final { scan-ipa-dump "inline hints: loop_iterations" "inline" } }
+! { dg-final { scan-ipa-dump-times "phi predicate:" 3 "fnsummary" } }
+! { dg-final { scan-ipa-dump "inline hints: loop_iterations" "fnsummary" } }
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Ipa function summary pass
2017-05-23 16:23 Ipa function summary pass Jan Hubicka
@ 2017-05-24 8:52 ` Christophe Lyon
2017-05-25 3:07 ` Paul Hua
0 siblings, 1 reply; 3+ messages in thread
From: Christophe Lyon @ 2017-05-24 8:52 UTC (permalink / raw)
To: Jan Hubicka; +Cc: gcc-patches
Hi,
On 23 May 2017 at 18:23, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> this patch finishes the breakup of ipa-inline and function analysis.
> The analysis is now done by separate pass and I will work on cleaning
> up the interfaces now.
>
> Honza
>
> * cgraphunit.c (symbol_table::process_new_functions): Update.
> * ipa-fnsummary.c (pass_data_inline_parameters): Remove.
> (inline_generate_summary): Rename to ...
> (ipa_fn_summary_generate): ... this one.
> (inline_read_summary): Rename to ...
> (ipa_fn_summary_read): ... this one.
> (inline_write_summary): Rename to ...
> (ipa_fn_summary_write): ... this one.
> (inline_free_summary): Rename to ...
> (ipa_free_fn_summary): ... this one.
> (pass_data_local_fn_summary, pass_local_fn_summary,
> make_pass_local_fn_summary, pass_data_ipa_free_fn_summary,
> pass_ipa_free_fn_summary, make_pass_ipa_free_fn_summary,
> pass_data_ipa_fn_summary, pass_ipa_fn_summary,
> make_pass_ipa_fn_summary): New.
> * ipa-fnsummary.h (inline_generate_summary, inline_read_summary,
> inline_write_summary, inline_free_summary): Remove.
> (ipa_free_fn_summary) : New.
> * ipa-inline.c (ipa_inline): Update.
> (pass_ipa_inline): Do not generate summaries.
> * ipa.c (pass_data_ipa_free_fn_summary, pass_ipa_free_fn_summary):
> Remove.
> * passes.def: Replace pass_inline_parameters by pass_local_fn_summary
> and add pass_ipa_fn_summary.
> * tree-pass.h (make_pass_ipa_fn_summary, make_pass_local_fn_summary):
> New.
> (make_pass_inline_parameters): Remove.
>
> * lto.c (do_whole_program_analysis): Replace inline_free_summary
> by ipa_free_fn_summary.
>
> * gcc.dg/ipa/ctor-empty-1.c: Update template.
> * gcc.dg/ipa/inline-5.c: Likewise.
> * gfortran.dg/pr48636.f90: Likewise.
> Index: cgraphunit.c
> ===================================================================
> --- cgraphunit.c (revision 248365)
> +++ cgraphunit.c (working copy)
> @@ -339,7 +339,7 @@ symbol_table::process_new_functions (voi
> and splitting. This is redundant for functions added late.
> Just throw away whatever it did. */
> if (!summaried_computed)
> - inline_free_summary ();
> + ipa_free_fn_summary ();
> }
> else if (ipa_fn_summaries != NULL)
> compute_fn_summary (node, true);
> Index: ipa-fnsummary.c
> ===================================================================
> --- ipa-fnsummary.c (revision 248366)
> +++ ipa-fnsummary.c (working copy)
> @@ -2504,46 +2504,6 @@ compute_fn_summary_for_current (void)
> return 0;
> }
>
> -namespace {
> -
> -const pass_data pass_data_inline_parameters =
> -{
> - GIMPLE_PASS, /* type */
> - "inline_param", /* name */
> - OPTGROUP_INLINE, /* optinfo_flags */
> - TV_INLINE_PARAMETERS, /* tv_id */
> - 0, /* properties_required */
> - 0, /* properties_provided */
> - 0, /* properties_destroyed */
> - 0, /* todo_flags_start */
> - 0, /* todo_flags_finish */
> -};
> -
> -class pass_inline_parameters : public gimple_opt_pass
> -{
> -public:
> - pass_inline_parameters (gcc::context *ctxt)
> - : gimple_opt_pass (pass_data_inline_parameters, ctxt)
> - {}
> -
> - /* opt_pass methods: */
> - opt_pass * clone () { return new pass_inline_parameters (m_ctxt); }
> - virtual unsigned int execute (function *)
> - {
> - return compute_fn_summary_for_current ();
> - }
> -
> -}; // class pass_inline_parameters
> -
> -} // anon namespace
> -
> -gimple_opt_pass *
> -make_pass_inline_parameters (gcc::context *ctxt)
> -{
> - return new pass_inline_parameters (ctxt);
> -}
> -
> -
> /* Estimate benefit devirtualizing indirect edge IE, provided KNOWN_VALS,
> KNOWN_CONTEXTS and KNOWN_AGGS. */
>
> @@ -3207,8 +3167,8 @@ ipa_fn_summary_t::insert (struct cgraph_
>
> /* Note function body size. */
>
> -void
> -inline_generate_summary (void)
> +static void
> +ipa_fn_summary_generate (void)
> {
> struct cgraph_node *node;
>
> @@ -3226,7 +3186,7 @@ inline_generate_summary (void)
> ipa_fn_summaries->enable_insertion_hook ();
>
> ipa_register_cgraph_hooks ();
> - inline_free_summary ();
> + ipa_free_fn_summary ();
>
> FOR_EACH_DEFINED_FUNCTION (node)
> if (!node->alias)
> @@ -3358,8 +3318,8 @@ inline_read_section (struct lto_file_dec
> and inliner, so when ipa-cp is active, we don't need to write them
> twice. */
>
> -void
> -inline_read_summary (void)
> +static void
> +ipa_fn_summary_read (void)
> {
> struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
> struct lto_file_decl_data *file_data;
> @@ -3419,8 +3379,8 @@ write_ipa_call_summary (struct output_bl
> Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
> active, we don't need to write them twice. */
>
> -void
> -inline_write_summary (void)
> +static void
> +ipa_fn_summary_write (void)
> {
> struct output_block *ob = create_output_block (LTO_section_ipa_fn_summary);
> lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
> @@ -3510,7 +3470,7 @@ inline_write_summary (void)
> /* Release inline summary. */
>
> void
> -inline_free_summary (void)
> +ipa_free_fn_summary (void)
> {
> struct cgraph_node *node;
> if (!ipa_call_summaries)
> @@ -3525,3 +3485,131 @@ inline_free_summary (void)
> ipa_call_summaries = NULL;
> edge_predicate_pool.release ();
> }
> +
> +namespace {
> +
> +const pass_data pass_data_local_fn_summary =
> +{
> + GIMPLE_PASS, /* type */
> + "local-fnsummary", /* name */
> + OPTGROUP_INLINE, /* optinfo_flags */
> + TV_INLINE_PARAMETERS, /* tv_id */
> + 0, /* properties_required */
> + 0, /* properties_provided */
> + 0, /* properties_destroyed */
> + 0, /* todo_flags_start */
> + 0, /* todo_flags_finish */
> +};
> +
> +class pass_local_fn_summary : public gimple_opt_pass
> +{
> +public:
> + pass_local_fn_summary (gcc::context *ctxt)
> + : gimple_opt_pass (pass_data_local_fn_summary, ctxt)
> + {}
> +
> + /* opt_pass methods: */
> + opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
> + virtual unsigned int execute (function *)
> + {
> + return compute_fn_summary_for_current ();
> + }
> +
> +}; // class pass_local_fn_summary
> +
> +} // anon namespace
> +
> +gimple_opt_pass *
> +make_pass_local_fn_summary (gcc::context *ctxt)
> +{
> + return new pass_local_fn_summary (ctxt);
> +}
> +
> +
> +/* Free inline summary. */
> +
> +namespace {
> +
> +const pass_data pass_data_ipa_free_fn_summary =
> +{
> + SIMPLE_IPA_PASS, /* type */
> + "free-fnsummary", /* name */
> + OPTGROUP_NONE, /* optinfo_flags */
> + TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
> + 0, /* properties_required */
> + 0, /* properties_provided */
> + 0, /* properties_destroyed */
> + 0, /* todo_flags_start */
> + /* Early optimizations may make function unreachable. We can not
> + remove unreachable functions as part of the ealry opts pass because
> + TODOs are run before subpasses. Do it here. */
> + ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
> +};
> +
> +class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
> +{
> +public:
> + pass_ipa_free_fn_summary (gcc::context *ctxt)
> + : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt)
> + {}
> +
> + /* opt_pass methods: */
> + virtual unsigned int execute (function *)
> + {
> + ipa_free_fn_summary ();
> + return 0;
> + }
> +
> +}; // class pass_ipa_free_fn_summary
> +
> +} // anon namespace
> +
> +simple_ipa_opt_pass *
> +make_pass_ipa_free_fn_summary (gcc::context *ctxt)
> +{
> + return new pass_ipa_free_fn_summary (ctxt);
> +}
> +
> +namespace {
> +
> +const pass_data pass_data_ipa_fn_summary =
> +{
> + IPA_PASS, /* type */
> + "fnsummary", /* name */
> + OPTGROUP_INLINE, /* optinfo_flags */
> + TV_IPA_INLINING, /* tv_id */
> + 0, /* properties_required */
> + 0, /* properties_provided */
> + 0, /* properties_destroyed */
> + 0, /* todo_flags_start */
> + ( TODO_dump_symtab ), /* todo_flags_finish */
> +};
> +
> +class pass_ipa_fn_summary : public ipa_opt_pass_d
> +{
> +public:
> + pass_ipa_fn_summary (gcc::context *ctxt)
> + : ipa_opt_pass_d (pass_data_ipa_fn_summary, ctxt,
> + ipa_fn_summary_generate, /* generate_summary */
> + ipa_fn_summary_write, /* write_summary */
> + ipa_fn_summary_read, /* read_summary */
> + NULL, /* write_optimization_summary */
> + NULL, /* read_optimization_summary */
> + NULL, /* stmt_fixup */
> + 0, /* function_transform_todo_flags_start */
> + NULL, /* function_transform */
> + NULL) /* variable_transform */
> + {}
> +
> + /* opt_pass methods: */
> + virtual unsigned int execute (function *) { return 0; }
> +
> +}; // class pass_ipa_fn_summary
> +
> +} // anon namespace
> +
> +ipa_opt_pass_d *
> +make_pass_ipa_fn_summary (gcc::context *ctxt)
> +{
> + return new pass_ipa_fn_summary (ctxt);
> +}
> Index: ipa-fnsummary.h
> ===================================================================
> --- ipa-fnsummary.h (revision 248365)
> +++ ipa-fnsummary.h (working copy)
> @@ -231,10 +231,7 @@ void ipa_debug_fn_summary (struct cgraph
> void ipa_dump_fn_summaries (FILE *f);
> void ipa_dump_fn_summary (FILE *f, struct cgraph_node *node);
> void ipa_dump_hints (FILE *f, ipa_hints);
> -void inline_generate_summary (void);
> -void inline_read_summary (void);
> -void inline_write_summary (void);
> -void inline_free_summary (void);
> +void ipa_free_fn_summary (void);
> void inline_analyze_function (struct cgraph_node *node);
> void estimate_ipcp_clone_size_and_time (struct cgraph_node *,
> vec<tree>,
> Index: ipa-inline.c
> ===================================================================
> --- ipa-inline.c (revision 248365)
> +++ ipa-inline.c (working copy)
> @@ -2513,7 +2513,7 @@ ipa_inline (void)
> ipa_dump_fn_summaries (dump_file);
> /* In WPA we use inline summaries for partitioning process. */
> if (!flag_wpa)
> - inline_free_summary ();
> + ipa_free_fn_summary ();
> return remove_functions ? TODO_remove_functions : 0;
> }
>
> @@ -2819,9 +2819,9 @@ class pass_ipa_inline : public ipa_opt_p
> public:
> pass_ipa_inline (gcc::context *ctxt)
> : ipa_opt_pass_d (pass_data_ipa_inline, ctxt,
> - inline_generate_summary, /* generate_summary */
> - inline_write_summary, /* write_summary */
> - inline_read_summary, /* read_summary */
> + NULL, /* generate_summary */
> + NULL, /* write_summary */
> + NULL, /* read_summary */
> NULL, /* write_optimization_summary */
> NULL, /* read_optimization_summary */
> NULL, /* stmt_fixup */
> Index: ipa.c
> ===================================================================
> --- ipa.c (revision 248365)
> +++ ipa.c (working copy)
> @@ -845,50 +845,6 @@ ipa_discover_readonly_nonaddressable_var
> return remove_p;
> }
>
> -/* Free inline summary. */
> -
> -namespace {
> -
> -const pass_data pass_data_ipa_free_fn_summary =
> -{
> - SIMPLE_IPA_PASS, /* type */
> - "free-inline-summary", /* name */
> - OPTGROUP_NONE, /* optinfo_flags */
> - TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
> - 0, /* properties_required */
> - 0, /* properties_provided */
> - 0, /* properties_destroyed */
> - 0, /* todo_flags_start */
> - /* Early optimizations may make function unreachable. We can not
> - remove unreachable functions as part of the ealry opts pass because
> - TODOs are run before subpasses. Do it here. */
> - ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
> -};
> -
> -class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
> -{
> -public:
> - pass_ipa_free_fn_summary (gcc::context *ctxt)
> - : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt)
> - {}
> -
> - /* opt_pass methods: */
> - virtual unsigned int execute (function *)
> - {
> - inline_free_summary ();
> - return 0;
> - }
> -
> -}; // class pass_ipa_free_fn_summary
> -
> -} // anon namespace
> -
> -simple_ipa_opt_pass *
> -make_pass_ipa_free_fn_summary (gcc::context *ctxt)
> -{
> - return new pass_ipa_free_fn_summary (ctxt);
> -}
> -
> /* Generate and emit a static constructor or destructor. WHICH must
> be one of 'I' (for a constructor), 'D' (for a destructor), 'P'
> (for chp static vars constructor) or 'B' (for chkp static bounds
> Index: lto/lto.c
> ===================================================================
> --- lto/lto.c (revision 248336)
> +++ lto/lto.c (working copy)
> @@ -3129,7 +3129,7 @@ do_whole_program_analysis (void)
>
> /* Inline summaries are needed for balanced partitioning. Free them now so
> the memory can be used for streamer caches. */
> - inline_free_summary ();
> + ipa_free_fn_summary ();
>
> /* AUX pointers are used by partitioning code to bookkeep number of
> partitions symbol is in. This is no longer needed. */
> Index: passes.def
> ===================================================================
> --- passes.def (revision 248365)
> +++ passes.def (working copy)
> @@ -75,7 +75,7 @@ along with GCC; see the file COPYING3.
> PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes)
> NEXT_PASS (pass_fixup_cfg);
> NEXT_PASS (pass_rebuild_cgraph_edges);
> - NEXT_PASS (pass_inline_parameters);
> + NEXT_PASS (pass_local_fn_summary);
> NEXT_PASS (pass_early_inline);
> NEXT_PASS (pass_all_early_optimizations);
> PUSH_INSERT_PASSES_WITHIN (pass_all_early_optimizations)
> @@ -110,7 +110,7 @@ along with GCC; see the file COPYING3.
> POP_INSERT_PASSES ()
> NEXT_PASS (pass_release_ssa_names);
> NEXT_PASS (pass_rebuild_cgraph_edges);
> - NEXT_PASS (pass_inline_parameters);
> + NEXT_PASS (pass_local_fn_summary);
> POP_INSERT_PASSES ()
>
> NEXT_PASS (pass_ipa_oacc);
> @@ -157,6 +157,7 @@ along with GCC; see the file COPYING3.
> NEXT_PASS (pass_ipa_cp);
> NEXT_PASS (pass_ipa_cdtor_merge);
> NEXT_PASS (pass_ipa_hsa);
> + NEXT_PASS (pass_ipa_fn_summary);
> NEXT_PASS (pass_ipa_inline);
> NEXT_PASS (pass_ipa_pure_const);
> NEXT_PASS (pass_ipa_reference);
> Index: tree-pass.h
> ===================================================================
> --- tree-pass.h (revision 248365)
> +++ tree-pass.h (working copy)
> @@ -494,6 +494,7 @@ extern ipa_opt_pass_d *make_pass_ipa_who
> *ctxt);
> extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
> *ctxt);
> +extern ipa_opt_pass_d *make_pass_ipa_fn_summary (gcc::context *ctxt);
> extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
> extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
> extern simple_ipa_opt_pass *make_pass_ipa_free_fn_summary (gcc::context *ctxt);
> @@ -617,7 +618,7 @@ extern rtl_opt_pass *make_pass_final (gc
> extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
> extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
> extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
> -extern gimple_opt_pass *make_pass_inline_parameters (gcc::context *ctxt);
> +extern gimple_opt_pass *make_pass_local_fn_summary (gcc::context *ctxt);
> extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
> extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
> extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
> Index: gcc.dg/ipa/ctor-empty-1.c
> ===================================================================
> --- gcc.dg/ipa/ctor-empty-1.c (revision 248374)
> +++ gcc.dg/ipa/ctor-empty-1.c (working copy)
> @@ -1,7 +1,7 @@
> /* { dg-do compile } */
> -/* { dg-options "-O3 -c -fdump-ipa-free-inline-summary" } */
> +/* { dg-options "-O3 -c -fdump-ipa-free-fnsummary" } */
> static __attribute__((constructor))
> void empty_constructor()
> {
> }
> -/* { dg-final { scan-ipa-dump "Reclaiming functions: empty_constructor" "free-inline-summary" } } */
> +/* { dg-final { scan-ipa-dump "Reclaiming functions: empty_constructor" "free-fnsummary" } } */
> Index: gcc.dg/ipa/inline-5.c
> ===================================================================
> --- gcc.dg/ipa/inline-5.c (revision 248374)
> +++ gcc.dg/ipa/inline-5.c (working copy)
> @@ -1,6 +1,6 @@
> /* Check statements that are eliminated by inlining. */
> /* { dg-do compile } */
> -/* { dg-options "-O2 -fdump-ipa-inline-details -fno-early-inlining -fno-partial-inlining -fno-ipa-cp" } */
> +/* { dg-options "-O2 -fdump-ipa-fnsummary-details -fno-early-inlining -fno-partial-inlining -fno-ipa-cp" } */
>
> struct a {int a,b,c,d,e;};
> void t(int);
> @@ -34,5 +34,5 @@ accessreference (struct a *a)
> /* Will be eliminated by inlining */
> }
>
> -/* { dg-final { scan-ipa-dump-times "Will be eliminated" 4 "inline" { xfail { { hppa*-*-* } && { ! lp64 } } } } } */
> -/* { dg-final { scan-ipa-dump-times "50. will be eliminated" 1 "inline" } } */
> +/* { dg-final { scan-ipa-dump-times "Will be eliminated" 4 "fnsummary" { xfail { { hppa*-*-* } && { ! lp64 } } } } } */
> +/* { dg-final { scan-ipa-dump-times "50. will be eliminated" 1 "fnsummary" } } */
> Index: gfortran.dg/pr48636.f90
> ===================================================================
> --- gfortran.dg/pr48636.f90 (revision 248374)
> +++ gfortran.dg/pr48636.f90 (working copy)
> @@ -1,5 +1,5 @@
> ! { dg-do compile }
> -! { dg-options "-O3 -fdump-ipa-inline-details -fno-ipa-cp" }
> +! { dg-options "-O3 -fdump-ipa-inline-details -fdump-ipa-fnsummary-details -fno-ipa-cp" }
>
> module foo
> implicit none
> @@ -34,5 +34,5 @@ program main
> end program main
>
> ! { dg-final { scan-ipa-dump "bar\[^\\n\]*inline copy in MAIN" "inline" } }
> -! { dg-final { scan-ipa-dump-times "phi predicate:" 3 "inline" } }
> -! { dg-final { scan-ipa-dump "inline hints: loop_iterations" "inline" } }
> +! { dg-final { scan-ipa-dump-times "phi predicate:" 3 "fnsummary" } }
> +! { dg-final { scan-ipa-dump "inline hints: loop_iterations" "fnsummary" } }
With this patch (commit r248375), I now see:
FAIL: gfortran.dg/pr48636.f90 -O scan-ipa-dump fnsummary "inline
hints: loop_iterations"
on aarch64 and arm targets.
Christophe
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Ipa function summary pass
2017-05-24 8:52 ` Christophe Lyon
@ 2017-05-25 3:07 ` Paul Hua
0 siblings, 0 replies; 3+ messages in thread
From: Paul Hua @ 2017-05-25 3:07 UTC (permalink / raw)
To: Christophe Lyon; +Cc: Jan Hubicka, gcc-patches
Hi,
On mips64el target:
New Fail:
FAIL: gfortran.dg/pr48636.f90 -O scan-ipa-dump fnsummary "inline
hints: loop_iterations"
Paul
On Wed, May 24, 2017 at 4:47 PM, Christophe Lyon
<christophe.lyon@linaro.org> wrote:
> Hi,
>
> On 23 May 2017 at 18:23, Jan Hubicka <hubicka@ucw.cz> wrote:
>> Hi,
>> this patch finishes the breakup of ipa-inline and function analysis.
>> The analysis is now done by separate pass and I will work on cleaning
>> up the interfaces now.
>>
>> Honza
>>
>> * cgraphunit.c (symbol_table::process_new_functions): Update.
>> * ipa-fnsummary.c (pass_data_inline_parameters): Remove.
>> (inline_generate_summary): Rename to ...
>> (ipa_fn_summary_generate): ... this one.
>> (inline_read_summary): Rename to ...
>> (ipa_fn_summary_read): ... this one.
>> (inline_write_summary): Rename to ...
>> (ipa_fn_summary_write): ... this one.
>> (inline_free_summary): Rename to ...
>> (ipa_free_fn_summary): ... this one.
>> (pass_data_local_fn_summary, pass_local_fn_summary,
>> make_pass_local_fn_summary, pass_data_ipa_free_fn_summary,
>> pass_ipa_free_fn_summary, make_pass_ipa_free_fn_summary,
>> pass_data_ipa_fn_summary, pass_ipa_fn_summary,
>> make_pass_ipa_fn_summary): New.
>> * ipa-fnsummary.h (inline_generate_summary, inline_read_summary,
>> inline_write_summary, inline_free_summary): Remove.
>> (ipa_free_fn_summary) : New.
>> * ipa-inline.c (ipa_inline): Update.
>> (pass_ipa_inline): Do not generate summaries.
>> * ipa.c (pass_data_ipa_free_fn_summary, pass_ipa_free_fn_summary):
>> Remove.
>> * passes.def: Replace pass_inline_parameters by pass_local_fn_summary
>> and add pass_ipa_fn_summary.
>> * tree-pass.h (make_pass_ipa_fn_summary, make_pass_local_fn_summary):
>> New.
>> (make_pass_inline_parameters): Remove.
>>
>> * lto.c (do_whole_program_analysis): Replace inline_free_summary
>> by ipa_free_fn_summary.
>>
>> * gcc.dg/ipa/ctor-empty-1.c: Update template.
>> * gcc.dg/ipa/inline-5.c: Likewise.
>> * gfortran.dg/pr48636.f90: Likewise.
>> Index: cgraphunit.c
>> ===================================================================
>> --- cgraphunit.c (revision 248365)
>> +++ cgraphunit.c (working copy)
>> @@ -339,7 +339,7 @@ symbol_table::process_new_functions (voi
>> and splitting. This is redundant for functions added late.
>> Just throw away whatever it did. */
>> if (!summaried_computed)
>> - inline_free_summary ();
>> + ipa_free_fn_summary ();
>> }
>> else if (ipa_fn_summaries != NULL)
>> compute_fn_summary (node, true);
>> Index: ipa-fnsummary.c
>> ===================================================================
>> --- ipa-fnsummary.c (revision 248366)
>> +++ ipa-fnsummary.c (working copy)
>> @@ -2504,46 +2504,6 @@ compute_fn_summary_for_current (void)
>> return 0;
>> }
>>
>> -namespace {
>> -
>> -const pass_data pass_data_inline_parameters =
>> -{
>> - GIMPLE_PASS, /* type */
>> - "inline_param", /* name */
>> - OPTGROUP_INLINE, /* optinfo_flags */
>> - TV_INLINE_PARAMETERS, /* tv_id */
>> - 0, /* properties_required */
>> - 0, /* properties_provided */
>> - 0, /* properties_destroyed */
>> - 0, /* todo_flags_start */
>> - 0, /* todo_flags_finish */
>> -};
>> -
>> -class pass_inline_parameters : public gimple_opt_pass
>> -{
>> -public:
>> - pass_inline_parameters (gcc::context *ctxt)
>> - : gimple_opt_pass (pass_data_inline_parameters, ctxt)
>> - {}
>> -
>> - /* opt_pass methods: */
>> - opt_pass * clone () { return new pass_inline_parameters (m_ctxt); }
>> - virtual unsigned int execute (function *)
>> - {
>> - return compute_fn_summary_for_current ();
>> - }
>> -
>> -}; // class pass_inline_parameters
>> -
>> -} // anon namespace
>> -
>> -gimple_opt_pass *
>> -make_pass_inline_parameters (gcc::context *ctxt)
>> -{
>> - return new pass_inline_parameters (ctxt);
>> -}
>> -
>> -
>> /* Estimate benefit devirtualizing indirect edge IE, provided KNOWN_VALS,
>> KNOWN_CONTEXTS and KNOWN_AGGS. */
>>
>> @@ -3207,8 +3167,8 @@ ipa_fn_summary_t::insert (struct cgraph_
>>
>> /* Note function body size. */
>>
>> -void
>> -inline_generate_summary (void)
>> +static void
>> +ipa_fn_summary_generate (void)
>> {
>> struct cgraph_node *node;
>>
>> @@ -3226,7 +3186,7 @@ inline_generate_summary (void)
>> ipa_fn_summaries->enable_insertion_hook ();
>>
>> ipa_register_cgraph_hooks ();
>> - inline_free_summary ();
>> + ipa_free_fn_summary ();
>>
>> FOR_EACH_DEFINED_FUNCTION (node)
>> if (!node->alias)
>> @@ -3358,8 +3318,8 @@ inline_read_section (struct lto_file_dec
>> and inliner, so when ipa-cp is active, we don't need to write them
>> twice. */
>>
>> -void
>> -inline_read_summary (void)
>> +static void
>> +ipa_fn_summary_read (void)
>> {
>> struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
>> struct lto_file_decl_data *file_data;
>> @@ -3419,8 +3379,8 @@ write_ipa_call_summary (struct output_bl
>> Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
>> active, we don't need to write them twice. */
>>
>> -void
>> -inline_write_summary (void)
>> +static void
>> +ipa_fn_summary_write (void)
>> {
>> struct output_block *ob = create_output_block (LTO_section_ipa_fn_summary);
>> lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
>> @@ -3510,7 +3470,7 @@ inline_write_summary (void)
>> /* Release inline summary. */
>>
>> void
>> -inline_free_summary (void)
>> +ipa_free_fn_summary (void)
>> {
>> struct cgraph_node *node;
>> if (!ipa_call_summaries)
>> @@ -3525,3 +3485,131 @@ inline_free_summary (void)
>> ipa_call_summaries = NULL;
>> edge_predicate_pool.release ();
>> }
>> +
>> +namespace {
>> +
>> +const pass_data pass_data_local_fn_summary =
>> +{
>> + GIMPLE_PASS, /* type */
>> + "local-fnsummary", /* name */
>> + OPTGROUP_INLINE, /* optinfo_flags */
>> + TV_INLINE_PARAMETERS, /* tv_id */
>> + 0, /* properties_required */
>> + 0, /* properties_provided */
>> + 0, /* properties_destroyed */
>> + 0, /* todo_flags_start */
>> + 0, /* todo_flags_finish */
>> +};
>> +
>> +class pass_local_fn_summary : public gimple_opt_pass
>> +{
>> +public:
>> + pass_local_fn_summary (gcc::context *ctxt)
>> + : gimple_opt_pass (pass_data_local_fn_summary, ctxt)
>> + {}
>> +
>> + /* opt_pass methods: */
>> + opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
>> + virtual unsigned int execute (function *)
>> + {
>> + return compute_fn_summary_for_current ();
>> + }
>> +
>> +}; // class pass_local_fn_summary
>> +
>> +} // anon namespace
>> +
>> +gimple_opt_pass *
>> +make_pass_local_fn_summary (gcc::context *ctxt)
>> +{
>> + return new pass_local_fn_summary (ctxt);
>> +}
>> +
>> +
>> +/* Free inline summary. */
>> +
>> +namespace {
>> +
>> +const pass_data pass_data_ipa_free_fn_summary =
>> +{
>> + SIMPLE_IPA_PASS, /* type */
>> + "free-fnsummary", /* name */
>> + OPTGROUP_NONE, /* optinfo_flags */
>> + TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
>> + 0, /* properties_required */
>> + 0, /* properties_provided */
>> + 0, /* properties_destroyed */
>> + 0, /* todo_flags_start */
>> + /* Early optimizations may make function unreachable. We can not
>> + remove unreachable functions as part of the ealry opts pass because
>> + TODOs are run before subpasses. Do it here. */
>> + ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
>> +};
>> +
>> +class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
>> +{
>> +public:
>> + pass_ipa_free_fn_summary (gcc::context *ctxt)
>> + : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt)
>> + {}
>> +
>> + /* opt_pass methods: */
>> + virtual unsigned int execute (function *)
>> + {
>> + ipa_free_fn_summary ();
>> + return 0;
>> + }
>> +
>> +}; // class pass_ipa_free_fn_summary
>> +
>> +} // anon namespace
>> +
>> +simple_ipa_opt_pass *
>> +make_pass_ipa_free_fn_summary (gcc::context *ctxt)
>> +{
>> + return new pass_ipa_free_fn_summary (ctxt);
>> +}
>> +
>> +namespace {
>> +
>> +const pass_data pass_data_ipa_fn_summary =
>> +{
>> + IPA_PASS, /* type */
>> + "fnsummary", /* name */
>> + OPTGROUP_INLINE, /* optinfo_flags */
>> + TV_IPA_INLINING, /* tv_id */
>> + 0, /* properties_required */
>> + 0, /* properties_provided */
>> + 0, /* properties_destroyed */
>> + 0, /* todo_flags_start */
>> + ( TODO_dump_symtab ), /* todo_flags_finish */
>> +};
>> +
>> +class pass_ipa_fn_summary : public ipa_opt_pass_d
>> +{
>> +public:
>> + pass_ipa_fn_summary (gcc::context *ctxt)
>> + : ipa_opt_pass_d (pass_data_ipa_fn_summary, ctxt,
>> + ipa_fn_summary_generate, /* generate_summary */
>> + ipa_fn_summary_write, /* write_summary */
>> + ipa_fn_summary_read, /* read_summary */
>> + NULL, /* write_optimization_summary */
>> + NULL, /* read_optimization_summary */
>> + NULL, /* stmt_fixup */
>> + 0, /* function_transform_todo_flags_start */
>> + NULL, /* function_transform */
>> + NULL) /* variable_transform */
>> + {}
>> +
>> + /* opt_pass methods: */
>> + virtual unsigned int execute (function *) { return 0; }
>> +
>> +}; // class pass_ipa_fn_summary
>> +
>> +} // anon namespace
>> +
>> +ipa_opt_pass_d *
>> +make_pass_ipa_fn_summary (gcc::context *ctxt)
>> +{
>> + return new pass_ipa_fn_summary (ctxt);
>> +}
>> Index: ipa-fnsummary.h
>> ===================================================================
>> --- ipa-fnsummary.h (revision 248365)
>> +++ ipa-fnsummary.h (working copy)
>> @@ -231,10 +231,7 @@ void ipa_debug_fn_summary (struct cgraph
>> void ipa_dump_fn_summaries (FILE *f);
>> void ipa_dump_fn_summary (FILE *f, struct cgraph_node *node);
>> void ipa_dump_hints (FILE *f, ipa_hints);
>> -void inline_generate_summary (void);
>> -void inline_read_summary (void);
>> -void inline_write_summary (void);
>> -void inline_free_summary (void);
>> +void ipa_free_fn_summary (void);
>> void inline_analyze_function (struct cgraph_node *node);
>> void estimate_ipcp_clone_size_and_time (struct cgraph_node *,
>> vec<tree>,
>> Index: ipa-inline.c
>> ===================================================================
>> --- ipa-inline.c (revision 248365)
>> +++ ipa-inline.c (working copy)
>> @@ -2513,7 +2513,7 @@ ipa_inline (void)
>> ipa_dump_fn_summaries (dump_file);
>> /* In WPA we use inline summaries for partitioning process. */
>> if (!flag_wpa)
>> - inline_free_summary ();
>> + ipa_free_fn_summary ();
>> return remove_functions ? TODO_remove_functions : 0;
>> }
>>
>> @@ -2819,9 +2819,9 @@ class pass_ipa_inline : public ipa_opt_p
>> public:
>> pass_ipa_inline (gcc::context *ctxt)
>> : ipa_opt_pass_d (pass_data_ipa_inline, ctxt,
>> - inline_generate_summary, /* generate_summary */
>> - inline_write_summary, /* write_summary */
>> - inline_read_summary, /* read_summary */
>> + NULL, /* generate_summary */
>> + NULL, /* write_summary */
>> + NULL, /* read_summary */
>> NULL, /* write_optimization_summary */
>> NULL, /* read_optimization_summary */
>> NULL, /* stmt_fixup */
>> Index: ipa.c
>> ===================================================================
>> --- ipa.c (revision 248365)
>> +++ ipa.c (working copy)
>> @@ -845,50 +845,6 @@ ipa_discover_readonly_nonaddressable_var
>> return remove_p;
>> }
>>
>> -/* Free inline summary. */
>> -
>> -namespace {
>> -
>> -const pass_data pass_data_ipa_free_fn_summary =
>> -{
>> - SIMPLE_IPA_PASS, /* type */
>> - "free-inline-summary", /* name */
>> - OPTGROUP_NONE, /* optinfo_flags */
>> - TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
>> - 0, /* properties_required */
>> - 0, /* properties_provided */
>> - 0, /* properties_destroyed */
>> - 0, /* todo_flags_start */
>> - /* Early optimizations may make function unreachable. We can not
>> - remove unreachable functions as part of the ealry opts pass because
>> - TODOs are run before subpasses. Do it here. */
>> - ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
>> -};
>> -
>> -class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
>> -{
>> -public:
>> - pass_ipa_free_fn_summary (gcc::context *ctxt)
>> - : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt)
>> - {}
>> -
>> - /* opt_pass methods: */
>> - virtual unsigned int execute (function *)
>> - {
>> - inline_free_summary ();
>> - return 0;
>> - }
>> -
>> -}; // class pass_ipa_free_fn_summary
>> -
>> -} // anon namespace
>> -
>> -simple_ipa_opt_pass *
>> -make_pass_ipa_free_fn_summary (gcc::context *ctxt)
>> -{
>> - return new pass_ipa_free_fn_summary (ctxt);
>> -}
>> -
>> /* Generate and emit a static constructor or destructor. WHICH must
>> be one of 'I' (for a constructor), 'D' (for a destructor), 'P'
>> (for chp static vars constructor) or 'B' (for chkp static bounds
>> Index: lto/lto.c
>> ===================================================================
>> --- lto/lto.c (revision 248336)
>> +++ lto/lto.c (working copy)
>> @@ -3129,7 +3129,7 @@ do_whole_program_analysis (void)
>>
>> /* Inline summaries are needed for balanced partitioning. Free them now so
>> the memory can be used for streamer caches. */
>> - inline_free_summary ();
>> + ipa_free_fn_summary ();
>>
>> /* AUX pointers are used by partitioning code to bookkeep number of
>> partitions symbol is in. This is no longer needed. */
>> Index: passes.def
>> ===================================================================
>> --- passes.def (revision 248365)
>> +++ passes.def (working copy)
>> @@ -75,7 +75,7 @@ along with GCC; see the file COPYING3.
>> PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes)
>> NEXT_PASS (pass_fixup_cfg);
>> NEXT_PASS (pass_rebuild_cgraph_edges);
>> - NEXT_PASS (pass_inline_parameters);
>> + NEXT_PASS (pass_local_fn_summary);
>> NEXT_PASS (pass_early_inline);
>> NEXT_PASS (pass_all_early_optimizations);
>> PUSH_INSERT_PASSES_WITHIN (pass_all_early_optimizations)
>> @@ -110,7 +110,7 @@ along with GCC; see the file COPYING3.
>> POP_INSERT_PASSES ()
>> NEXT_PASS (pass_release_ssa_names);
>> NEXT_PASS (pass_rebuild_cgraph_edges);
>> - NEXT_PASS (pass_inline_parameters);
>> + NEXT_PASS (pass_local_fn_summary);
>> POP_INSERT_PASSES ()
>>
>> NEXT_PASS (pass_ipa_oacc);
>> @@ -157,6 +157,7 @@ along with GCC; see the file COPYING3.
>> NEXT_PASS (pass_ipa_cp);
>> NEXT_PASS (pass_ipa_cdtor_merge);
>> NEXT_PASS (pass_ipa_hsa);
>> + NEXT_PASS (pass_ipa_fn_summary);
>> NEXT_PASS (pass_ipa_inline);
>> NEXT_PASS (pass_ipa_pure_const);
>> NEXT_PASS (pass_ipa_reference);
>> Index: tree-pass.h
>> ===================================================================
>> --- tree-pass.h (revision 248365)
>> +++ tree-pass.h (working copy)
>> @@ -494,6 +494,7 @@ extern ipa_opt_pass_d *make_pass_ipa_who
>> *ctxt);
>> extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
>> *ctxt);
>> +extern ipa_opt_pass_d *make_pass_ipa_fn_summary (gcc::context *ctxt);
>> extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
>> extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
>> extern simple_ipa_opt_pass *make_pass_ipa_free_fn_summary (gcc::context *ctxt);
>> @@ -617,7 +618,7 @@ extern rtl_opt_pass *make_pass_final (gc
>> extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
>> extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
>> extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
>> -extern gimple_opt_pass *make_pass_inline_parameters (gcc::context *ctxt);
>> +extern gimple_opt_pass *make_pass_local_fn_summary (gcc::context *ctxt);
>> extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
>> extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
>> extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
>> Index: gcc.dg/ipa/ctor-empty-1.c
>> ===================================================================
>> --- gcc.dg/ipa/ctor-empty-1.c (revision 248374)
>> +++ gcc.dg/ipa/ctor-empty-1.c (working copy)
>> @@ -1,7 +1,7 @@
>> /* { dg-do compile } */
>> -/* { dg-options "-O3 -c -fdump-ipa-free-inline-summary" } */
>> +/* { dg-options "-O3 -c -fdump-ipa-free-fnsummary" } */
>> static __attribute__((constructor))
>> void empty_constructor()
>> {
>> }
>> -/* { dg-final { scan-ipa-dump "Reclaiming functions: empty_constructor" "free-inline-summary" } } */
>> +/* { dg-final { scan-ipa-dump "Reclaiming functions: empty_constructor" "free-fnsummary" } } */
>> Index: gcc.dg/ipa/inline-5.c
>> ===================================================================
>> --- gcc.dg/ipa/inline-5.c (revision 248374)
>> +++ gcc.dg/ipa/inline-5.c (working copy)
>> @@ -1,6 +1,6 @@
>> /* Check statements that are eliminated by inlining. */
>> /* { dg-do compile } */
>> -/* { dg-options "-O2 -fdump-ipa-inline-details -fno-early-inlining -fno-partial-inlining -fno-ipa-cp" } */
>> +/* { dg-options "-O2 -fdump-ipa-fnsummary-details -fno-early-inlining -fno-partial-inlining -fno-ipa-cp" } */
>>
>> struct a {int a,b,c,d,e;};
>> void t(int);
>> @@ -34,5 +34,5 @@ accessreference (struct a *a)
>> /* Will be eliminated by inlining */
>> }
>>
>> -/* { dg-final { scan-ipa-dump-times "Will be eliminated" 4 "inline" { xfail { { hppa*-*-* } && { ! lp64 } } } } } */
>> -/* { dg-final { scan-ipa-dump-times "50. will be eliminated" 1 "inline" } } */
>> +/* { dg-final { scan-ipa-dump-times "Will be eliminated" 4 "fnsummary" { xfail { { hppa*-*-* } && { ! lp64 } } } } } */
>> +/* { dg-final { scan-ipa-dump-times "50. will be eliminated" 1 "fnsummary" } } */
>> Index: gfortran.dg/pr48636.f90
>> ===================================================================
>> --- gfortran.dg/pr48636.f90 (revision 248374)
>> +++ gfortran.dg/pr48636.f90 (working copy)
>> @@ -1,5 +1,5 @@
>> ! { dg-do compile }
>> -! { dg-options "-O3 -fdump-ipa-inline-details -fno-ipa-cp" }
>> +! { dg-options "-O3 -fdump-ipa-inline-details -fdump-ipa-fnsummary-details -fno-ipa-cp" }
>>
>> module foo
>> implicit none
>> @@ -34,5 +34,5 @@ program main
>> end program main
>>
>> ! { dg-final { scan-ipa-dump "bar\[^\\n\]*inline copy in MAIN" "inline" } }
>> -! { dg-final { scan-ipa-dump-times "phi predicate:" 3 "inline" } }
>> -! { dg-final { scan-ipa-dump "inline hints: loop_iterations" "inline" } }
>> +! { dg-final { scan-ipa-dump-times "phi predicate:" 3 "fnsummary" } }
>> +! { dg-final { scan-ipa-dump "inline hints: loop_iterations" "fnsummary" } }
>
>
> With this patch (commit r248375), I now see:
> FAIL: gfortran.dg/pr48636.f90 -O scan-ipa-dump fnsummary "inline
> hints: loop_iterations"
> on aarch64 and arm targets.
>
> Christophe
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-05-25 2:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-23 16:23 Ipa function summary pass Jan Hubicka
2017-05-24 8:52 ` Christophe Lyon
2017-05-25 3:07 ` Paul Hua
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).