re PR tree-optimization/46367 (ICE during cgraph edge cloning)

PR tree-optimization/46367
	* g++.dg/torture/pr46367.C: New file.
	* ipa-inline.c (cgraph_clone_inlined_nodes): Use original function only
	when we can update original.
	(cgraph_mark_inline_edge): Sanity check.
	* ipa-prop.c (ipa_make_edge_direct_to_target): Sanity check.

From-SVN: r168587
This commit is contained in:
Jan Hubicka 2011-01-07 23:52:54 +01:00 committed by Jan Hubicka
parent c12e816f59
commit 17afc0fe9c
5 changed files with 34 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2011-01-07 Jan Hubicka <jh@suse.cz>
PR tree-optimization/46367
* ipa-inline.c (cgraph_clone_inlined_nodes): Use original function only
when we can update original.
(cgraph_mark_inline_edge): Sanity check.
* ipa-prop.c (ipa_make_edge_direct_to_target): Sanity check.
2011-01-07 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> 2011-01-07 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* config/spu/spu.h (ASM_COMMENT_START): Define. * config/spu/spu.h (ASM_COMMENT_START): Define.

View File

@ -232,6 +232,8 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
/* We may eliminate the need for out-of-line copy to be output. /* We may eliminate the need for out-of-line copy to be output.
In that case just go ahead and re-use it. */ In that case just go ahead and re-use it. */
if (!e->callee->callers->next_caller if (!e->callee->callers->next_caller
/* Recursive inlining never wants the master clone to be overwritten. */
&& update_original
/* FIXME: When address is taken of DECL_EXTERNAL function we still can remove its /* FIXME: When address is taken of DECL_EXTERNAL function we still can remove its
offline copy, but we would need to keep unanalyzed node in the callgraph so offline copy, but we would need to keep unanalyzed node in the callgraph so
references can point to it. */ references can point to it. */
@ -303,7 +305,11 @@ cgraph_mark_inline_edge (struct cgraph_edge *e, bool update_original,
struct cgraph_edge *curr = e; struct cgraph_edge *curr = e;
int freq; int freq;
/* Don't inline inlined edges. */
gcc_assert (e->inline_failed); gcc_assert (e->inline_failed);
/* Don't even think of inlining inline clone. */
gcc_assert (!e->callee->global.inlined_to);
e->inline_failed = CIF_OK; e->inline_failed = CIF_OK;
DECL_POSSIBLY_INLINED (e->callee->decl) = true; DECL_POSSIBLY_INLINED (e->callee->decl) = true;
@ -863,7 +869,6 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node,
master_clone = cgraph_clone_node (node, node->decl, master_clone = cgraph_clone_node (node, node->decl,
node->count, CGRAPH_FREQ_BASE, 1, node->count, CGRAPH_FREQ_BASE, 1,
false, NULL); false, NULL);
master_clone->needed = true;
for (e = master_clone->callees; e; e = e->next_callee) for (e = master_clone->callees; e; e = e->next_callee)
if (!e->inline_failed) if (!e->inline_failed)
cgraph_clone_inlined_nodes (e, true, false); cgraph_clone_inlined_nodes (e, true, false);

View File

@ -1483,6 +1483,10 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target, tree delta)
return NULL; return NULL;
ipa_check_create_node_params (); ipa_check_create_node_params ();
/* We can not make edges to inline clones. It is bug that someone removed the cgraph
node too early. */
gcc_assert (!callee->global.inlined_to);
cgraph_make_edge_direct (ie, callee, delta ? tree_low_cst (delta, 0) : 0); cgraph_make_edge_direct (ie, callee, delta ? tree_low_cst (delta, 0) : 0);
if (dump_file) if (dump_file)
{ {

View File

@ -1,3 +1,8 @@
2011-01-07 Jan Hubicka <jh@suse.cz>
PR tree-optimization/46367
* g++.dg/torture/pr46367.C: New file.
2011-01-07 Jakub Jelinek <jakub@redhat.com> 2011-01-07 Jakub Jelinek <jakub@redhat.com>
PR target/47201 PR target/47201

View File

@ -0,0 +1,11 @@
#pragma interface
struct S
{
S *s;
~S ()
{
delete s;
}
};
S s;