Commit 97e59627 by Martin Liska Committed by Martin Liska

Reduce SCCs in IPA postorder.

2019-06-10  Martin Liska  <mliska@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.

From-SVN: r272115
parent 54e2d83c
2019-06-10 Martin Liska <mliska@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.
2019-06-10 Claudiu Zissulescu <claziss@synopsys.com> 2019-06-10 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.c (arc_rtx_costs): Update costs. * config/arc/arc.c (arc_rtx_costs): Update costs.
......
...@@ -806,6 +806,21 @@ public: ...@@ -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. */ /* Allocate the arrays in TOPO and topologically sort the nodes into order. */
static void static void
...@@ -815,7 +830,8 @@ build_toporder_info (struct ipa_topo_info *topo) ...@@ -815,7 +830,8 @@ build_toporder_info (struct ipa_topo_info *topo)
topo->stack = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count); topo->stack = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
gcc_checking_assert (topo->stack_top == 0); 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 /* Free information about strongly connected components and the arrays in
......
...@@ -1752,6 +1752,16 @@ sum_callers (struct cgraph_node *node, void *data) ...@@ -1752,6 +1752,16 @@ sum_callers (struct cgraph_node *node, void *data)
return false; 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: /* We use greedy algorithm for inlining of small functions:
All inline candidates are put into prioritized heap ordered in All inline candidates are put into prioritized heap ordered in
increasing badness. increasing badness.
...@@ -1779,7 +1789,7 @@ inline_small_functions (void) ...@@ -1779,7 +1789,7 @@ inline_small_functions (void)
metrics. */ metrics. */
max_count = profile_count::uninitialized (); max_count = profile_count::uninitialized ();
ipa_reduced_postorder (order, true, NULL); ipa_reduced_postorder (order, true, ignore_edge_p);
free (order); free (order);
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
......
...@@ -1361,12 +1361,14 @@ ignore_edge_for_nothrow (struct cgraph_edge *e) ...@@ -1361,12 +1361,14 @@ ignore_edge_for_nothrow (struct cgraph_edge *e)
return true; return true;
enum availability avail; enum availability avail;
cgraph_node *n = e->callee->function_or_virtual_thunk_symbol (&avail, cgraph_node *ultimate_target
e->caller); = e->callee->function_or_virtual_thunk_symbol (&avail, e->caller);
if (avail <= AVAIL_INTERPOSABLE || TREE_NOTHROW (n->decl)) if (avail <= AVAIL_INTERPOSABLE || TREE_NOTHROW (ultimate_target->decl))
return true; return true;
return opt_for_fn (e->callee->decl, flag_non_call_exceptions) return ((opt_for_fn (e->callee->decl, flag_non_call_exceptions)
&& !e->callee->binds_to_current_def_p (e->caller); && !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. /* Return true if NODE is self recursive function.
...@@ -1396,16 +1398,21 @@ cdtor_p (cgraph_node *n, void *) ...@@ -1396,16 +1398,21 @@ cdtor_p (cgraph_node *n, void *)
return false; 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 static bool
ignore_edge_for_pure_const (struct cgraph_edge *e) ignore_edge_for_pure_const (struct cgraph_edge *e)
{ {
enum availability avail; enum availability avail;
e->callee->function_or_virtual_thunk_symbol (&avail, e->caller); cgraph_node *ultimate_target
return (avail <= AVAIL_INTERPOSABLE); = 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 /* Produce transitive closure over the callgraph and compute pure/const
attributes. */ attributes. */
......
...@@ -676,16 +676,23 @@ get_read_write_all_from_node (struct cgraph_node *node, ...@@ -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 /* Skip edges from and to nodes without ipa_reference enabled.
them out of strongy connected coponents and makes them easyto skip in the Ignore not available symbols. This leave
them out of strongly connected components and makes them easy to skip in the
propagation loop bellow. */ propagation loop bellow. */
static bool static bool
ignore_edge_p (cgraph_edge *e) ignore_edge_p (cgraph_edge *e)
{ {
return (!opt_for_fn (e->caller->decl, flag_ipa_reference) enum availability avail;
|| !opt_for_fn (e->callee->function_symbol ()->decl, cgraph_node *ultimate_target
flag_ipa_reference)); = 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 /* Produce the global information by preforming a transitive closure
......
...@@ -103,8 +103,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v, ...@@ -103,8 +103,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v,
continue; continue;
if (w->aux if (w->aux
&& (avail > AVAIL_INTERPOSABLE && (avail >= AVAIL_INTERPOSABLE))
|| avail == AVAIL_INTERPOSABLE))
{ {
w_info = (struct ipa_dfs_info *) w->aux; w_info = (struct ipa_dfs_info *) w->aux;
if (w_info->new_node) if (w_info->new_node)
......
...@@ -244,5 +244,3 @@ odr_type_p (const_tree t) ...@@ -244,5 +244,3 @@ odr_type_p (const_tree t)
} }
#endif /* GCC_IPA_UTILS_H */ #endif /* GCC_IPA_UTILS_H */
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