Re: Turn inline_edge_summary into ipa_call_summary
> > and way way more (C, Ada, ...). Assuming that the ipa-predicate.[ch] > patch was really only cosmetic, this only leaves your patch in this rev > range. > > Please fix. Hi, I apologize for the breakage. I already commited a fix before lunch but seems my email did not get through. I am attaching it. I amanged to bundle into patch a local change which turn call_stmt_size/time unsigned and confuses one comparsion in want_inline_small_function_p. Honza * ipa-inline.h (ipa_call_summary): Turn sizes into signed; add ctor. * ipa-inline.c (want_inline_small_function_p): Do not cast to unsigned. Index: ipa-inline.h === --- ipa-inline.h(revision 248262) +++ ipa-inline.h(working copy) @@ -189,10 +189,18 @@ struct ipa_call_summary /* Vector indexed by parameters. */ vec param; /* Estimated size and time of the call statement. */ - unsigned int call_stmt_size; - unsigned int call_stmt_time; + int call_stmt_size; + int call_stmt_time; /* Depth of loop nest, 0 means no nesting. */ unsigned int loop_depth; + + /* Keep all field empty so summary dumping works during its computation. + This is useful for debugging. */ + ipa_call_summary () +: predicate (NULL), param (vNULL), call_stmt_size (0), call_stmt_time (0), + loop_depth (0) +{ +} }; class ipa_call_summary_t: public call_summary Index: ipa-inline.c === --- ipa-inline.c(revision 248262) +++ ipa-inline.c(working copy) @@ -723,7 +723,7 @@ want_inline_small_function_p (struct cgr && (!e->count || !e->maybe_hot_p ())) && inline_summaries->get (callee)->min_size - ipa_call_summaries->get (e)->call_stmt_size - > (unsigned)MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO)) + > MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO)) { e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT; want_inline = false; @@ -731,7 +731,7 @@ want_inline_small_function_p (struct cgr else if ((DECL_DECLARED_INLINE_P (callee->decl) || e->count) && inline_summaries->get (callee)->min_size - ipa_call_summaries->get (e)->call_stmt_size - > (unsigned)16 * MAX_INLINE_INSNS_SINGLE) + > 16 * MAX_INLINE_INSNS_SINGLE) { e->inline_failed = (DECL_DECLARED_INLINE_P (callee->decl) ? CIF_MAX_INLINE_INSNS_SINGLE_LIMIT
Re: Turn inline_edge_summary into ipa_call_summary
Hi Jan, > this patch makes edge summaries to use call_summary template and renames them > as they are not inliner specific for few years. > > Bootstrapped/regtested x86_64-linux. > > Honza > > * ipa-inline-analysis.c (cgraph_2edge_hook_list, cgraph_edge_hook_list, > inline_edge_removal_hook, inline_edge_duplication_hook): Remove. > (inline_edge_summary_vec): Turn into ... > (ipa_call_summaries): ... this one. > (redirect_to_unreachable, edge_set_predicate, > evaluate_properties_for_edge, inline_summary_alloc, > reset_ipa_call_summary, reset_inline_summary, > inline_summary_t::duplicate): Update. > (inline_edge_duplication_hook): Turn to ... > (ipa_call_summary_t::duplicate): ... this one. > (inline_edge_removal_hook): Turn to ... > (ipa_call_summary_t::remove): ... this one. > (dump_inline_edge_summary): Turn to ... > (dump_ipa_call_summary): ... this one. > (estimate_function_body_sizes): Update. > (inline_update_callee_summaries): Update. > (remap_edge_change_prob): Update. > (remap_edge_summaries): Update. > (inline_merge_summary): Update. > (do_estimate_edge_time): Update. > (inline_generate_summary): Update. > (inline_read_section): Update. > (inline_read_summary): Update. > (inline_free_summary): Update. > * ipa-inline.c (can_inline_edge_p): Update. > (compute_inlined_call_time): Update. > (want_inline_small_function_p): Update. > (edge_badness): Update. > (early_inliner): Update. > * ipa-inline.h (inline_edge_summary): Turn to ... > (ipa_call_summary): ... this one. > (ipa_call_summary_t): New class. > (inline_edge_summary_t, inline_edge_summary_vec): Remove. > (ipa_call_summaries): New. > (inline_edge_summary): Remove. > (estimate_edge_growth): Update. > * ipa-profile.c (ipa_propagate_frequency_1): Update. > * ipa-prop.c (ipa_make_edge_direct_to_target): Update. > * ipa-split.c (execute_split_functions): Update. > * ipa.c (symbol_table::remove_unreachable_nodes): Update. between r248242 and r248262, a very large number of IPA-related testsuite regressions occured, e.g. on x86_64-pc-linux-gnu, but also on sparc-sun-solaris2.12: +FAIL: g++.dg/ipa/devirt-42.C -std=gnu++11 scan-ipa-dump-times inline "Discovered a virtual call to a known target" 2 +FAIL: g++.dg/ipa/devirt-42.C -std=gnu++11 scan-tree-dump-times optimized "return 2" 3 +FAIL: g++.dg/ipa/devirt-42.C -std=gnu++14 scan-ipa-dump-times inline "Discovered a virtual call to a known target" 2 +FAIL: g++.dg/ipa/devirt-42.C -std=gnu++14 scan-tree-dump-times optimized "return 2" 3 +FAIL: g++.dg/ipa/devirt-42.C -std=gnu++98 scan-ipa-dump-times inline "Discovered a virtual call to a known target" 2 +FAIL: g++.dg/ipa/devirt-42.C -std=gnu++98 scan-tree-dump-times optimized "return 2" 3 +FAIL: g++.dg/ipa/devirt-45.C -std=gnu++11 scan-ipa-dump-times inline "Discovered a virtual call to a known target[^n]*A::foo" 1 +FAIL: g++.dg/ipa/devirt-45.C -std=gnu++14 scan-ipa-dump-times inline "Discovered a virtual call to a known target[^n]*A::foo" 1 +FAIL: g++.dg/ipa/devirt-45.C -std=gnu++98 scan-ipa-dump-times inline "Discovered a virtual call to a known target[^n]*A::foo" 1 +FAIL: g++.dg/ipa/inline-1.C -std=gnu++11 scan-ipa-dump-times inline "Considering void inline_me(" 1 +FAIL: g++.dg/ipa/inline-1.C -std=gnu++11 scan-ipa-dump-times inline "Considering void inline_me_too(" 1 +FAIL: g++.dg/ipa/inline-1.C -std=gnu++14 scan-ipa-dump-times inline "Considering void inline_me(" 1 +FAIL: g++.dg/ipa/inline-1.C -std=gnu++14 scan-ipa-dump-times inline "Considering void inline_me_too(" 1 +FAIL: g++.dg/ipa/inline-1.C -std=gnu++98 scan-ipa-dump-times inline "Considering void inline_me(" 1 +FAIL: g++.dg/ipa/inline-1.C -std=gnu++98 scan-ipa-dump-times inline "Considering void inline_me_too(" 1 +FAIL: g++.dg/ipa/inline-2.C -std=gnu++11 scan-ipa-dump-times inline "Considering void inline_me(" 1 +FAIL: g++.dg/ipa/inline-2.C -std=gnu++11 scan-ipa-dump-times inline "Considering void inline_me_too(" 1 +FAIL: g++.dg/ipa/inline-2.C -std=gnu++14 scan-ipa-dump-times inline "Considering void inline_me(" 1 +FAIL: g++.dg/ipa/inline-2.C -std=gnu++14 scan-ipa-dump-times inline "Considering void inline_me_too(" 1 +FAIL: g++.dg/ipa/inline-2.C -std=gnu++98 scan-ipa-dump-times inline "Considering void inline_me(" 1 +FAIL: g++.dg/ipa/inline-2.C -std=gnu++98 scan-ipa-dump-times inline "Considering
Turn inline_edge_summary into ipa_call_summary
Hi, this patch makes edge summaries to use call_summary template and renames them as they are not inliner specific for few years. Bootstrapped/regtested x86_64-linux. Honza * ipa-inline-analysis.c (cgraph_2edge_hook_list, cgraph_edge_hook_list, inline_edge_removal_hook, inline_edge_duplication_hook): Remove. (inline_edge_summary_vec): Turn into ... (ipa_call_summaries): ... this one. (redirect_to_unreachable, edge_set_predicate, evaluate_properties_for_edge, inline_summary_alloc, reset_ipa_call_summary, reset_inline_summary, inline_summary_t::duplicate): Update. (inline_edge_duplication_hook): Turn to ... (ipa_call_summary_t::duplicate): ... this one. (inline_edge_removal_hook): Turn to ... (ipa_call_summary_t::remove): ... this one. (dump_inline_edge_summary): Turn to ... (dump_ipa_call_summary): ... this one. (estimate_function_body_sizes): Update. (inline_update_callee_summaries): Update. (remap_edge_change_prob): Update. (remap_edge_summaries): Update. (inline_merge_summary): Update. (do_estimate_edge_time): Update. (inline_generate_summary): Update. (inline_read_section): Update. (inline_read_summary): Update. (inline_free_summary): Update. * ipa-inline.c (can_inline_edge_p): Update. (compute_inlined_call_time): Update. (want_inline_small_function_p): Update. (edge_badness): Update. (early_inliner): Update. * ipa-inline.h (inline_edge_summary): Turn to ... (ipa_call_summary): ... this one. (ipa_call_summary_t): New class. (inline_edge_summary_t, inline_edge_summary_vec): Remove. (ipa_call_summaries): New. (inline_edge_summary): Remove. (estimate_edge_growth): Update. * ipa-profile.c (ipa_propagate_frequency_1): Update. * ipa-prop.c (ipa_make_edge_direct_to_target): Update. * ipa-split.c (execute_split_functions): Update. * ipa.c (symbol_table::remove_unreachable_nodes): Update. Index: ipa-inline-analysis.c === --- ipa-inline-analysis.c (revision 248241) +++ ipa-inline-analysis.c (working copy) @@ -86,17 +86,9 @@ along with GCC; see the file COPYING3. #include "cfgexpand.h" #include "gimplify.h" -/* Holders of ipa cgraph hooks: */ -static struct cgraph_2edge_hook_list *edge_duplication_hook_holder; -static struct cgraph_edge_hook_list *edge_removal_hook_holder; -static void inline_edge_removal_hook (struct cgraph_edge *, void *); -static void inline_edge_duplication_hook (struct cgraph_edge *, - struct cgraph_edge *, void *); - -/* VECtor holding inline summaries. - In GGC memory because conditions might point to constant trees. */ +/* Summaries. */ function_summary *inline_summaries; -vec inline_edge_summary_vec; +call_summary *ipa_call_summaries; /* Cached node/edge growths. */ vec edge_growth_cache; @@ -254,7 +246,7 @@ redirect_to_unreachable (struct cgraph_e e->make_direct (target); else e->redirect_callee (target); - struct inline_edge_summary *es = inline_edge_summary (e); + struct ipa_call_summary *es = ipa_call_summaries->get (e); e->inline_failed = CIF_UNREACHABLE; e->frequency = 0; e->count = 0; @@ -279,7 +271,7 @@ edge_set_predicate (struct cgraph_edge * && (!e->speculative || e->callee)) e = redirect_to_unreachable (e); - struct inline_edge_summary *es = inline_edge_summary (e); + struct ipa_call_summary *es = ipa_call_summaries->get (e); if (predicate && *predicate != true) { if (!es->predicate) @@ -457,7 +449,7 @@ evaluate_properties_for_edge (struct cgr { struct ipa_node_params *parms_info; struct ipa_edge_args *args = IPA_EDGE_REF (e); - struct inline_edge_summary *es = inline_edge_summary (e); + struct ipa_call_summary *es = ipa_call_summaries->get (e); int i, count = ipa_get_cs_argument_count (args); if (e->caller->global.inlined_to) @@ -540,36 +532,25 @@ evaluate_properties_for_edge (struct cgr static void inline_summary_alloc (void) { - if (!edge_removal_hook_holder) -edge_removal_hook_holder = - symtab->add_edge_removal_hook (_edge_removal_hook, NULL); - if (!edge_duplication_hook_holder) -edge_duplication_hook_holder = - symtab->add_edge_duplication_hook (_edge_duplication_hook, NULL); - if (!inline_summaries) -inline_summaries = (inline_summary_t*) inline_summary_t::create_ggc (symtab); - - if (inline_edge_summary_vec.length () <= (unsigned) symtab->edges_max_uid) -inline_edge_summary_vec.safe_grow_cleared (symtab->edges_max_uid + 1); +inline_summaries = inline_summary_t::create_ggc (symtab); +