On 2/19/19 2:25 PM, Martin Jambor wrote: > Hi, > > On Tue, Feb 19 2019, Martin Liška wrote: >> On 2/14/19 11:19 AM, Jan Hubicka wrote: >>> > > ... > >>> Next stage1 we should also teach the callback to ignore edges of calls >>> that are not being optimized. >> >> I'm sending patch for that. > > ... > >> gcc/ChangeLog: >> >> 2019-02-19 Martin Liska <mli...@suse.cz> >> >> * ipa-cp.c (ignore_edge_p): New function. >> (build_toporder_info): Use it. >> * ipa-inline.c (ignore_edge_p): New function/ >> (inline_small_functions): Use it. >> * ipa-pure-const.c (ignore_edge_for_nothrow): >> Verify opt_for_fn for caller and callee. >> (ignore_edge_for_pure_const): Likewise. >> * ipa-reference.c (ignore_edge_p): Extend to check >> for opt_for_fn. >> * ipa-utils.c (searchc): Refactor. >> * ipa-utils.h: Fix coding style. >> --- >> gcc/ipa-cp.c | 18 +++++++++++++++++- >> gcc/ipa-inline.c | 12 +++++++++++- >> gcc/ipa-pure-const.c | 17 ++++++++++++----- >> gcc/ipa-reference.c | 13 ++++++++++--- >> gcc/ipa-utils.c | 3 +-- >> gcc/ipa-utils.h | 2 -- >> 6 files changed, 51 insertions(+), 14 deletions(-) >> >> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c >> index 442d5c63eff..004b3a34b1c 100644 >> --- a/gcc/ipa-cp.c >> +++ b/gcc/ipa-cp.c >> @@ -806,6 +806,21 @@ public: >> {} >> }; >> >> +/* Skip edges from and to nodes without ipa_cp enabled. >> + Ignore not available symbols. */ >> + >> +static bool >> +ignore_edge_p (cgraph_edge *e) >> +{ >> + enum availability avail; >> + e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); > > Can't the return value of this call be directly fed... > >> + >> + return (avail <= AVAIL_INTERPOSABLE >> + || !opt_for_fn (e->caller->decl, flag_ipa_cp) >> + || !opt_for_fn (e->callee->function_symbol ()->decl, > > ...here instead of calling function_symbol... which does not look > through thunks which IMHO you want, even if only for consistency.
Yes, I like it. There's a new version of the patch I've just tested. Martin > > Otherwise, it the IPA-CP bits obviously look good, > > Martin >
>From 2f18f1610640013fbc3a1eea9360b400b0d322e9 Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Mon, 11 Feb 2019 16:47:06 +0100 Subject: [PATCH] Reduce SCCs in IPA postorder. gcc/ChangeLog: 2019-02-19 Martin Liska <mli...@suse.cz> * ipa-cp.c (ignore_edge_p): New function. (build_toporder_info): Use it. * ipa-inline.c (ignore_edge_p): New function/ (inline_small_functions): Use it. * ipa-pure-const.c (ignore_edge_for_nothrow): Verify opt_for_fn for caller and callee. (ignore_edge_for_pure_const): Likewise. * ipa-reference.c (ignore_edge_p): Extend to check for opt_for_fn. * ipa-utils.c (searchc): Refactor. * ipa-utils.h: Fix coding style. --- gcc/ipa-cp.c | 18 +++++++++++++++++- gcc/ipa-inline.c | 12 +++++++++++- gcc/ipa-pure-const.c | 25 ++++++++++++++++--------- gcc/ipa-reference.c | 17 ++++++++++++----- gcc/ipa-utils.c | 3 +-- gcc/ipa-utils.h | 2 -- 6 files changed, 57 insertions(+), 20 deletions(-) diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 442d5c63eff..6959b7db1aa 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -806,6 +806,21 @@ public: {} }; +/* Skip edges from and to nodes without ipa_cp enabled. + Ignore not available symbols. */ + +static bool +ignore_edge_p (cgraph_edge *e) +{ + enum availability avail; + cgraph_node *ultimate_target + = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); + + return (avail <= AVAIL_INTERPOSABLE + || !opt_for_fn (e->caller->decl, flag_ipa_cp) + || !opt_for_fn (ultimate_target->decl, flag_ipa_cp)); +} + /* Allocate the arrays in TOPO and topologically sort the nodes into order. */ static void @@ -815,7 +830,8 @@ build_toporder_info (struct ipa_topo_info *topo) topo->stack = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count); gcc_checking_assert (topo->stack_top == 0); - topo->nnodes = ipa_reduced_postorder (topo->order, true, NULL); + topo->nnodes = ipa_reduced_postorder (topo->order, true, + ignore_edge_p); } /* Free information about strongly connected components and the arrays in diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 360c3de3289..d6314bc0e57 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1751,6 +1751,16 @@ sum_callers (struct cgraph_node *node, void *data) return false; } +/* We only propagate across edges with non-interposable callee. */ + +inline bool +ignore_edge_p (struct cgraph_edge *e) +{ + enum availability avail; + e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); + return (avail <= AVAIL_INTERPOSABLE); +} + /* We use greedy algorithm for inlining of small functions: All inline candidates are put into prioritized heap ordered in increasing badness. @@ -1778,7 +1788,7 @@ inline_small_functions (void) metrics. */ max_count = profile_count::uninitialized (); - ipa_reduced_postorder (order, true, NULL); + ipa_reduced_postorder (order, true, ignore_edge_p); free (order); FOR_EACH_DEFINED_FUNCTION (node) diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index bb561d00853..f5e53967df1 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -1361,12 +1361,14 @@ ignore_edge_for_nothrow (struct cgraph_edge *e) return true; enum availability avail; - cgraph_node *n = e->callee->function_or_virtual_thunk_symbol (&avail, - e->caller); - if (avail <= AVAIL_INTERPOSABLE || TREE_NOTHROW (n->decl)) + cgraph_node *ultimate_target + = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); + if (avail <= AVAIL_INTERPOSABLE || TREE_NOTHROW (ultimate_target->decl)) return true; - return opt_for_fn (e->callee->decl, flag_non_call_exceptions) - && !e->callee->binds_to_current_def_p (e->caller); + return ((opt_for_fn (e->callee->decl, flag_non_call_exceptions) + && !e->callee->binds_to_current_def_p (e->caller)) + || !opt_for_fn (e->caller->decl, flag_ipa_pure_const) + || !opt_for_fn (ultimate_target->decl, flag_ipa_pure_const)); } /* Return true if NODE is self recursive function. @@ -1396,16 +1398,21 @@ cdtor_p (cgraph_node *n, void *) return false; } -/* We only propagate across edges with non-interposable callee. */ +/* Skip edges from and to nodes without ipa_pure_const enabled. + Ignore not available symbols. */ static bool ignore_edge_for_pure_const (struct cgraph_edge *e) { enum availability avail; - e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); - return (avail <= AVAIL_INTERPOSABLE); -} + cgraph_node *ultimate_target + = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); + return (avail <= AVAIL_INTERPOSABLE + || !opt_for_fn (e->caller->decl, flag_ipa_pure_const) + || !opt_for_fn (ultimate_target->decl, + flag_ipa_pure_const)); +} /* Produce transitive closure over the callgraph and compute pure/const attributes. */ diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index 9ef03c2505b..7b2614ffa28 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -676,16 +676,23 @@ get_read_write_all_from_node (struct cgraph_node *node, } } -/* Skip edges from and to nodes without ipa_reference enables. This leave - them out of strongy connected coponents and makes them easyto skip in the +/* Skip edges from and to nodes without ipa_reference enabled. + Ignore not available symbols. This leave + them out of strongly connected components and makes them easy to skip in the propagation loop bellow. */ static bool ignore_edge_p (cgraph_edge *e) { - return (!opt_for_fn (e->caller->decl, flag_ipa_reference) - || !opt_for_fn (e->callee->function_symbol ()->decl, - flag_ipa_reference)); + enum availability avail; + cgraph_node *ultimate_target + = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); + + return (avail < AVAIL_INTERPOSABLE + || (avail == AVAIL_INTERPOSABLE + && !(flags_from_decl_or_type (e->callee->decl) & ECF_LEAF)) + || !opt_for_fn (e->caller->decl, flag_ipa_reference) + || !opt_for_fn (ultimate_target->decl, flag_ipa_reference)); } /* Produce the global information by preforming a transitive closure diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c index 79b250c3943..25c2e2cf789 100644 --- a/gcc/ipa-utils.c +++ b/gcc/ipa-utils.c @@ -103,8 +103,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v, continue; if (w->aux - && (avail > AVAIL_INTERPOSABLE - || avail == AVAIL_INTERPOSABLE)) + && (avail >= AVAIL_INTERPOSABLE)) { w_info = (struct ipa_dfs_info *) w->aux; if (w_info->new_node) diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h index b70e8c57108..c4a9664852a 100644 --- a/gcc/ipa-utils.h +++ b/gcc/ipa-utils.h @@ -263,5 +263,3 @@ odr_type_p (const_tree t) } #endif /* GCC_IPA_UTILS_H */ - - -- 2.20.1