From 8222c37ededfe0f55233898ecc7c4cc023f6389c Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Thu, 17 Jan 2013 12:43:14 +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-17 Martin Jambor PR tree-optimizations/55264 * ipa-inline-transform.c (can_remove_node_now_p_1): Never return true for virtual methods. * ipa.c (symtab_remove_unreachable_nodes): Never return true for virtual methods before inlining is over. * cgraph.h (cgraph_only_called_directly_or_aliased_p): Return false for virtual functions. * cgraphclones.c (cgraph_create_virtual_clone): Mark clones as non-virtual. testsuite/ * g++.dg/ipa/pr55264.C: New test. From-SVN: r195262 --- gcc/ChangeLog | 12 ++++++++++++ gcc/cgraph.h | 1 + gcc/cgraphclones.c | 1 + gcc/ipa-inline-transform.c | 4 +--- gcc/ipa.c | 3 +-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ipa/pr55264.C | 17 +++++++++++++++++ 7 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr55264.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 41a4b42b993..6475b3c081e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2013-01-17 Martin Jambor + + PR tree-optimizations/55264 + * ipa-inline-transform.c (can_remove_node_now_p_1): Never return true + for virtual methods. + * ipa.c (symtab_remove_unreachable_nodes): Never return true for + virtual methods before inlining is over. + * cgraph.h (cgraph_only_called_directly_or_aliased_p): Return false for + virtual functions. + * cgraphclones.c (cgraph_create_virtual_clone): Mark clones as + non-virtual. + 2013-01-16 Vladimir Makarov PR rtl-optimization/56005 diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 87595701654..5df7fb478b4 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -1164,6 +1164,7 @@ cgraph_only_called_directly_or_aliased_p (struct cgraph_node *node) gcc_assert (!node->global.inlined_to); return (!node->symbol.force_output && !node->symbol.address_taken && !node->symbol.used_from_other_partition + && !DECL_VIRTUAL_P (node->symbol.decl) && !DECL_STATIC_CONSTRUCTOR (node->symbol.decl) && !DECL_STATIC_DESTRUCTOR (node->symbol.decl) && !node->symbol.externally_visible); diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 611bb811e57..30d02d11dd9 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -319,6 +319,7 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node, TREE_PUBLIC (new_node->symbol.decl) = 0; DECL_COMDAT (new_node->symbol.decl) = 0; DECL_WEAK (new_node->symbol.decl) = 0; + DECL_VIRTUAL_P (new_node->symbol.decl) = 0; DECL_STATIC_CONSTRUCTOR (new_node->symbol.decl) = 0; DECL_STATIC_DESTRUCTOR (new_node->symbol.decl) = 0; new_node->clone.tree_map = tree_map; diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 0fb8940b82b..cac20fecc3b 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -92,9 +92,7 @@ can_remove_node_now_p_1 (struct cgraph_node *node) those only after all devirtualizable virtual calls are processed. Lacking may edges in callgraph we just preserve them post inlining. */ - && (!DECL_VIRTUAL_P (node->symbol.decl) - || (!DECL_COMDAT (node->symbol.decl) - && !DECL_EXTERNAL (node->symbol.decl))) + && !DECL_VIRTUAL_P (node->symbol.decl) /* During early inlining some unanalyzed cgraph nodes might be in the callgraph and they might reffer the function in question. */ && !cgraph_new_nodes); diff --git a/gcc/ipa.c b/gcc/ipa.c index f87e03b7e04..a9b8fb41988 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -241,8 +241,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file) && (!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->symbol.decl) - && (DECL_COMDAT (node->symbol.decl) || DECL_EXTERNAL (node->symbol.decl))))) + && DECL_VIRTUAL_P (node->symbol.decl)))) { gcc_assert (!node->global.inlined_to); pointer_set_insert (reachable, node); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7572696951e..f6bef191bbe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-17 Martin Jambor + + PR tree-optimizations/55264 + * g++.dg/ipa/pr55264.C: New test. + 2013-01-16 Janus Weil PR fortran/55983 diff --git a/gcc/testsuite/g++.dg/ipa/pr55264.C b/gcc/testsuite/g++.dg/ipa/pr55264.C new file mode 100644 index 00000000000..cf54d6ae2a9 --- /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 (); +}