aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline-transform.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2013-06-24 14:40:17 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2013-06-24 14:40:17 +0200
commit44a60244592da0196f7c1d8cfe56bc95d7cdae0e (patch)
treef89f7096e73c7e3897bc706a86a08d49270d459d /gcc/ipa-inline-transform.c
parent7c5848b89955c3ec45a78630f23d610f13e3e47b (diff)
downloadgcc-44a60244592da0196f7c1d8cfe56bc95d7cdae0e.zip
gcc-44a60244592da0196f7c1d8cfe56bc95d7cdae0e.tar.gz
gcc-44a60244592da0196f7c1d8cfe56bc95d7cdae0e.tar.bz2
re PR tree-optimization/57539 (ice in ipa_edge_duplication_hook)
2013-06-24 Martin Jambor <mjambor@suse.cz> PR tree-optimization/57539 * cgraphclones.c (cgraph_clone_node): Add parameter new_inlined_to, set global.inlined_to of the new node to it. All callers changed. * ipa-inline-transform.c (clone_inlined_nodes): New variable inlining_into, pass it to cgraph_clone_node. * ipa-prop.c (ipa_propagate_indirect_call_infos): Do not call ipa_free_edge_args_substructures. (ipa_edge_duplication_hook): Only add edges from inlined nodes to rdesc linked list. Do not assert rdesc edges have inlined caller. Assert we have found an rdesc in the rdesc list. From-SVN: r200368
Diffstat (limited to 'gcc/ipa-inline-transform.c')
-rw-r--r--gcc/ipa-inline-transform.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 9e131a4..d421c87 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -132,6 +132,13 @@ void
clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
bool update_original, int *overall_size)
{
+ struct cgraph_node *inlining_into;
+
+ if (e->caller->global.inlined_to)
+ inlining_into = e->caller->global.inlined_to;
+ else
+ inlining_into = e->caller;
+
if (duplicate)
{
/* We may eliminate the need for out-of-line copy to be output.
@@ -167,18 +174,15 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
{
struct cgraph_node *n;
n = cgraph_clone_node (e->callee, e->callee->symbol.decl,
- e->count, e->frequency,
- update_original, vNULL, true);
+ e->count, e->frequency, update_original,
+ vNULL, true, inlining_into);
cgraph_redirect_edge_callee (e, n);
}
}
else
symtab_dissolve_same_comdat_group_list ((symtab_node) e->callee);
- if (e->caller->global.inlined_to)
- e->callee->global.inlined_to = e->caller->global.inlined_to;
- else
- e->callee->global.inlined_to = e->caller;
+ e->callee->global.inlined_to = inlining_into;
/* Recursively clone all bodies. */
for (e = e->callee->callees; e; e = e->next_callee)