Commit d83fa499 by Eric Botcazou Committed by Eric Botcazou

ipa-inline-transform.c (master_clone_with_noninline_clones_p): New.

	* ipa-inline-transform.c (master_clone_with_noninline_clones_p): New.
	(clone_inlined_nodes): Do not overwrite the clone if above predicate
	returns true.

From-SVN: r216415
parent d9b7be2e
2014-10-17 Eric Botcazou <ebotcazou@adacore.com>
* ipa-inline-transform.c (master_clone_with_noninline_clones_p): New.
(clone_inlined_nodes): Do not overwrite the clone if above predicate
returns true.
2014-10-17 Ilya Tocar <ilya.tocar@intel.com> 2014-10-17 Ilya Tocar <ilya.tocar@intel.com>
* config/i386/i386.c (MAX_VECT_LEN): Move earlier. * config/i386/i386.c (MAX_VECT_LEN): Move earlier.
...@@ -122,6 +122,20 @@ can_remove_node_now_p (struct cgraph_node *node, struct cgraph_edge *e) ...@@ -122,6 +122,20 @@ can_remove_node_now_p (struct cgraph_node *node, struct cgraph_edge *e)
return true; return true;
} }
/* Return true if NODE is a master clone with non-inline clones. */
static bool
master_clone_with_noninline_clones_p (struct cgraph_node *node)
{
if (node->clone_of)
return false;
for (struct cgraph_node *n = node->clones; n; n = n->next_sibling_clone)
if (n->decl != node->decl)
return true;
return false;
}
/* E is expected to be an edge being inlined. Clone destination node of /* E is expected to be an edge being inlined. Clone destination node of
the edge and redirect it to the new clone. the edge and redirect it to the new clone.
...@@ -155,7 +169,10 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, ...@@ -155,7 +169,10 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
/* Recursive inlining never wants the master clone to /* Recursive inlining never wants the master clone to
be overwritten. */ be overwritten. */
&& update_original && update_original
&& can_remove_node_now_p (e->callee, e)) && can_remove_node_now_p (e->callee, e)
/* We cannot overwrite a master clone with non-inline clones
until after these clones are materialized. */
&& !master_clone_with_noninline_clones_p (e->callee))
{ {
/* TODO: When callee is in a comdat group, we could remove all of it, /* TODO: When callee is in a comdat group, we could remove all of it,
including all inline clones inlined into it. That would however including all inline clones inlined into it. That would however
......
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