From 45272fd22f6f77463d46751acf1c7ceeeeec0689 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Mon, 11 Feb 2019 09:13:03 +0100 Subject: [PATCH] Construct ipa_reduced_postorder always for overwritable (PR ipa/89009). 2019-02-11 Martin Liska PR ipa/89009 * ipa-cp.c (build_toporder_info): Remove usage of a param. * ipa-inline.c (inline_small_functions): Likewise. * ipa-pure-const.c (propagate_pure_const): Likewise. (propagate_nothrow): Likewise. * ipa-reference.c (propagate): Likewise. * ipa-utils.c (struct searchc_env): Remove unused field. (searchc): Always search across AVAIL_INTERPOSABLE. (ipa_reduced_postorder): Always allow AVAIL_INTERPOSABLE as the only called IPA pure const can properly not propagate across interposable boundary. * ipa-utils.h (ipa_reduced_postorder): Remove param. 2019-02-11 Martin Liska PR ipa/89009 * g++.dg/ipa/pr89009.C: New test. From-SVN: r268762 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/ipa-cp.c | 2 +- gcc/ipa-inline.c | 2 +- gcc/ipa-pure-const.c | 4 ++-- gcc/ipa-reference.c | 2 +- gcc/ipa-utils.c | 9 +++------ gcc/ipa-utils.h | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ipa/pr89009.C | 12 ++++++++++++ 9 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr89009.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 06d5124bf45..9e938f753b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2019-02-11 Martin Liska + + PR ipa/89009 + * ipa-cp.c (build_toporder_info): Remove usage of a param. + * ipa-inline.c (inline_small_functions): Likewise. + * ipa-pure-const.c (propagate_pure_const): Likewise. + (propagate_nothrow): Likewise. + * ipa-reference.c (propagate): Likewise. + * ipa-utils.c (struct searchc_env): Remove unused field. + (searchc): Always search across AVAIL_INTERPOSABLE. + (ipa_reduced_postorder): Always allow AVAIL_INTERPOSABLE as + the only called IPA pure const can properly not propagate + across interposable boundary. + * ipa-utils.h (ipa_reduced_postorder): Remove param. + 2019-02-11 Chung-Ju Wu * config/nds32/nds32.md (call_internal, call_value_internal, diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 3489ed59ce2..442d5c63eff 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -815,7 +815,7 @@ 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, true, NULL); + topo->nnodes = ipa_reduced_postorder (topo->order, true, NULL); } /* Free information about strongly connected components and the arrays in diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 4ddbfdf772c..360c3de3289 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1778,7 +1778,7 @@ inline_small_functions (void) metrics. */ max_count = profile_count::uninitialized (); - ipa_reduced_postorder (order, true, true, NULL); + ipa_reduced_postorder (order, true, NULL); free (order); FOR_EACH_DEFINED_FUNCTION (node) diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c index 8227eed29bc..a8a3956d2d5 100644 --- a/gcc/ipa-pure-const.c +++ b/gcc/ipa-pure-const.c @@ -1422,7 +1422,7 @@ propagate_pure_const (void) bool remove_p = false; bool has_cdtor; - order_pos = ipa_reduced_postorder (order, true, false, + order_pos = ipa_reduced_postorder (order, true, ignore_edge_for_pure_const); if (dump_file) { @@ -1751,7 +1751,7 @@ propagate_nothrow (void) int i; struct ipa_dfs_info * w_info; - order_pos = ipa_reduced_postorder (order, true, false, + order_pos = ipa_reduced_postorder (order, true, ignore_edge_for_nothrow); if (dump_file) { diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c index 8ad12d30bb2..d1759a374bc 100644 --- a/gcc/ipa-reference.c +++ b/gcc/ipa-reference.c @@ -712,7 +712,7 @@ propagate (void) the global information. All the nodes within a cycle will have the same info so we collapse cycles first. Then we can do the propagation in one pass from the leaves to the roots. */ - order_pos = ipa_reduced_postorder (order, true, true, ignore_edge_p); + order_pos = ipa_reduced_postorder (order, true, ignore_edge_p); if (dump_file) ipa_print_order (dump_file, "reduced", order, order_pos); diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c index aebcb8ea91d..79b250c3943 100644 --- a/gcc/ipa-utils.c +++ b/gcc/ipa-utils.c @@ -63,7 +63,6 @@ struct searchc_env { int order_pos; splay_tree nodes_marked_new; bool reduce; - bool allow_overwritable; int count; }; @@ -105,7 +104,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v, if (w->aux && (avail > AVAIL_INTERPOSABLE - || (env->allow_overwritable && avail == AVAIL_INTERPOSABLE))) + || avail == AVAIL_INTERPOSABLE)) { w_info = (struct ipa_dfs_info *) w->aux; if (w_info->new_node) @@ -162,7 +161,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v, int ipa_reduced_postorder (struct cgraph_node **order, - bool reduce, bool allow_overwritable, + bool reduce, bool (*ignore_edge) (struct cgraph_edge *)) { struct cgraph_node *node; @@ -175,15 +174,13 @@ ipa_reduced_postorder (struct cgraph_node **order, env.nodes_marked_new = splay_tree_new (splay_tree_compare_ints, 0, 0); env.count = 1; env.reduce = reduce; - env.allow_overwritable = allow_overwritable; FOR_EACH_DEFINED_FUNCTION (node) { enum availability avail = node->get_availability (); if (avail > AVAIL_INTERPOSABLE - || (allow_overwritable - && (avail == AVAIL_INTERPOSABLE))) + || avail == AVAIL_INTERPOSABLE) { /* Reuse the info if it is already there. */ struct ipa_dfs_info *info = (struct ipa_dfs_info *) node->aux; diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h index 618d74f78ee..b70e8c57108 100644 --- a/gcc/ipa-utils.h +++ b/gcc/ipa-utils.h @@ -36,7 +36,7 @@ struct ipa_dfs_info { /* In ipa-utils.c */ void ipa_print_order (FILE*, const char *, struct cgraph_node**, int); -int ipa_reduced_postorder (struct cgraph_node **, bool, bool, +int ipa_reduced_postorder (struct cgraph_node **, bool, bool (*ignore_edge) (struct cgraph_edge *)); void ipa_free_postorder_info (void); vec ipa_get_nodes_in_cycle (struct cgraph_node *); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d550d9eaced..37af06ad0d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-02-11 Martin Liska + + PR ipa/89009 + * g++.dg/ipa/pr89009.C: New test. + 2019-02-10 Thomas Koenig PR fortran/71723 diff --git a/gcc/testsuite/g++.dg/ipa/pr89009.C b/gcc/testsuite/g++.dg/ipa/pr89009.C new file mode 100644 index 00000000000..6b4fc65a641 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr89009.C @@ -0,0 +1,12 @@ +/* PR ipa/89009 */ +/* { dg-do run } */ +/* { dg-options "-fvisibility=hidden -fpic -O2 -fno-inline" } */ + +#pragma GCC visibility push(default) +void foo1() { __builtin_printf ("foo\n"); } +#pragma GCC visibility pop +void foo2() { __builtin_printf ("foo\n"); } + +int main() { foo2(); return 0; } + +/* { dg-output "foo" } */ -- 2.30.2