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  <mjambor@suse.cz>

	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
This commit is contained in:
Martin Jambor 2013-01-17 12:43:14 +01:00 committed by Martin Jambor
parent c5e7e996fb
commit 8222c37ede
7 changed files with 38 additions and 5 deletions

View File

@ -1,3 +1,15 @@
2013-01-17 Martin Jambor <mjambor@suse.cz>
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 <vmakarov@redhat.com>
PR rtl-optimization/56005

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -1,3 +1,8 @@
2013-01-17 Martin Jambor <mjambor@suse.cz>
PR tree-optimizations/55264
* g++.dg/ipa/pr55264.C: New test.
2013-01-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/55983

View File

@ -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 ();
}