From e96b21a8e6b8b1191292ad2c27c53eda9255b86c Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Mon, 21 Jan 2013 18:09:22 +0100 Subject: [PATCH] re PR tree-optimization/55264 (ICE: in ipa_make_edge_direct_to_target, at ipa-prop.c:2141 with -O2 -fno-early-inlining -fno-weak) 2013-01-21 Martin Jambor PR tree-optimizations/55264 * cgraph.c (cgraph_create_virtual_clone): Mark clones as non-virtual. * cgraph.h (cgraph_only_called_directly_p): Return false for virtual functions. * ipa-inline.c (cgraph_clone_inlined_nodes): Do reuse nodes of any virtual function. * ipa.c (cgraph_remove_unreachable_nodes): Never return true for virtual methods before inlining is over. testsuite/ * g++.dg/ipa/pr55264.C: New test. From-SVN: r195340 --- gcc/ChangeLog | 14 ++++++++++++++ gcc/cgraph.c | 1 + gcc/cgraph.h | 1 + gcc/ipa-inline.c | 3 +-- gcc/ipa.c | 4 +--- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/g++.dg/ipa/pr55264.C | 17 +++++++++++++++++ 7 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr55264.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 370363b92521..6d73511d6217 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2013-01-21 Martin Jambor + + Backport from mainline + 2013-01-17 Martin Jambor + + PR tree-optimizations/55264 + * cgraph.c (cgraph_create_virtual_clone): Mark clones as non-virtual. + * cgraph.h (cgraph_only_called_directly_p): Return false for virtual + functions. + * ipa-inline.c (cgraph_clone_inlined_nodes): Do reuse nodes of any + virtual function. + * ipa.c (cgraph_remove_unreachable_nodes): Never return true for + virtual methods before inlining is over. + 2013-01-14 Matthias Klose * doc/invoke.texi: Document -print-multiarch. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index d62674a0b300..201e77dba86a 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2342,6 +2342,7 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node, TREE_PUBLIC (new_node->decl) = 0; DECL_COMDAT (new_node->decl) = 0; DECL_WEAK (new_node->decl) = 0; + DECL_VIRTUAL_P (new_node->decl) = 0; new_node->clone.tree_map = tree_map; new_node->clone.args_to_skip = args_to_skip; FOR_EACH_VEC_ELT (ipa_replace_map_p, tree_map, i, map) diff --git a/gcc/cgraph.h b/gcc/cgraph.h index c83b4d38ccc4..bad1bb987f48 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -912,6 +912,7 @@ cgraph_only_called_directly_p (struct cgraph_node *node) gcc_assert (!node->global.inlined_to); return (!node->needed && !node->address_taken && !node->reachable_from_other_partition + && !DECL_VIRTUAL_P (node->decl) && !DECL_STATIC_CONSTRUCTOR (node->decl) && !DECL_STATIC_DESTRUCTOR (node->decl) && !node->local.externally_visible); diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 62e1610718ec..3fc796adfecc 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -243,8 +243,7 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, those only after all devirtualizable virtual calls are processed. Lacking may edges in callgraph we just preserve them post inlining. */ - && (!DECL_VIRTUAL_P (e->callee->decl) - || (!DECL_COMDAT (e->callee->decl) && !DECL_EXTERNAL (e->callee->decl))) + && !DECL_VIRTUAL_P (e->callee->decl) /* Don't reuse if more than one function shares a comdat group. If the other function(s) are needed, we need to emit even this function out of line. */ diff --git a/gcc/ipa.c b/gcc/ipa.c index 49554083c020..ade8706e621a 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -235,9 +235,7 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file) if (node->analyzed && !node->global.inlined_to && (!cgraph_can_remove_if_no_direct_calls_and_refs_p (node) /* Keep around virtual functions for possible devirtualization. */ - || (before_inlining_p - && DECL_VIRTUAL_P (node->decl) - && (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))) + || (before_inlining_p && DECL_VIRTUAL_P (node->decl)) /* Also external functions with address taken are better to stay for indirect inlining. */ || (before_inlining_p diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 81664c64afdd..457de3f23aa9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-01-21 Martin Jambor + + Backport from mainline + 2013-01-17 Martin Jambor + + PR tree-optimizations/55264 + * g++.dg/ipa/pr55264.C: New test. + 2013-01-14 Janus Weil PR fortran/55072 diff --git a/gcc/testsuite/g++.dg/ipa/pr55264.C b/gcc/testsuite/g++.dg/ipa/pr55264.C new file mode 100644 index 000000000000..cf54d6ae2a96 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr55264.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-early-inlining -fno-weak" } */ + +struct S +{ + S(); + virtual inline void foo () + { + foo(); + } +}; + +void +B () +{ + S().foo (); +} -- 2.47.2