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

        PR tree-optimizations/55264
	* cgraph.c (cgraph_create_virtual_clone): Mark clones as non-virtual.
	* cgraph.h (cgraph_only_called_directly_p_or_aliased_p): Return false
	for virtual functions.
	* ipa-inline-transform.c (can_remove_node_now_p_1): Never return true
	for virtual methods.
	* 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: r195339
This commit is contained in:
Martin Jambor 2013-01-21 18:02:08 +01:00 committed by Martin Jambor
parent cb3a18b7c7
commit 944cb208c3
7 changed files with 43 additions and 6 deletions

View File

@ -1,3 +1,17 @@
2013-01-21 Martin Jambor <mjambor@suse.cz>
Backport from mainline
2013-01-17 Martin Jambor <mjambor@suse.cz>
PR tree-optimizations/55264
* cgraph.c (cgraph_create_virtual_clone): Mark clones as non-virtual.
* cgraph.h (cgraph_only_called_directly_p_or_aliased_p): Return false
for virtual functions.
* ipa-inline-transform.c (can_remove_node_now_p_1): Never return true
for virtual methods.
* ipa.c (cgraph_remove_unreachable_nodes): Never return true for
virtual methods before inlining is over.
2012-01-17 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline

View File

@ -2269,6 +2269,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;
DECL_STATIC_CONSTRUCTOR (new_node->decl) = 0;
DECL_STATIC_DESTRUCTOR (new_node->decl) = 0;
new_node->clone.tree_map = tree_map;

View File

@ -935,6 +935,7 @@ cgraph_only_called_directly_or_aliased_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);

View File

@ -95,9 +95,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->decl)
|| (!DECL_COMDAT (node->decl)
&& !DECL_EXTERNAL (node->decl)))
&& !DECL_VIRTUAL_P (node->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

@ -194,9 +194,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))))
{
gcc_assert (!node->global.inlined_to);
enqueue_cgraph_node (node, &first);

View File

@ -1,3 +1,11 @@
2013-01-21 Martin Jambor <mjambor@suse.cz>
Backport from mainline
2013-01-17 Martin Jambor <mjambor@suse.cz>
PR tree-optimizations/55264
* g++.dg/ipa/pr55264.C: New test.
2012-01-17 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline

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