Commit 17afc0fe by Jan Hubicka Committed by Jan Hubicka

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
parent c12e816f
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.
......
...@@ -232,6 +232,8 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, ...@@ -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, ...@@ -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, ...@@ -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);
......
...@@ -1483,6 +1483,10 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target, tree delta) ...@@ -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)
{ {
......
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
......
#pragma interface
struct S
{
S *s;
~S ()
{
delete s;
}
};
S s;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment