cgraph.h (cgraph_node): New method expand_all_artificial_thunks.
2014-12-05 Martin Jambor <mjambor@suse.cz> * cgraph.h (cgraph_node): New method expand_all_artificial_thunks. (cgraph_edge): New method redirect_callee_duplicating_thunks. * cgraphclones.c (duplicate_thunk_for_node): Donot expand newly created thunks. (redirect_edge_duplicating_thunks): Turned into edge method redirect_callee_duplicating_thunks. (cgraph_node::expand_all_artificial_thunks): New method. (create_clone): Call expand_all_artificial_thunks. * ipa-cp.c (perhaps_add_new_callers): Call redirect_callee_duplicating_thunks instead of redirect_callee. Also call expand_all_artificial_thunks. From-SVN: r218417
This commit is contained in:
parent
612b47110a
commit
6a4bad955f
|
@ -1,3 +1,17 @@
|
|||
2014-12-05 Martin Jambor <mjambor@suse.cz>
|
||||
|
||||
* cgraph.h (cgraph_node): New method expand_all_artificial_thunks.
|
||||
(cgraph_edge): New method redirect_callee_duplicating_thunks.
|
||||
* cgraphclones.c (duplicate_thunk_for_node): Donot expand newly
|
||||
created thunks.
|
||||
(redirect_edge_duplicating_thunks): Turned into edge method
|
||||
redirect_callee_duplicating_thunks.
|
||||
(cgraph_node::expand_all_artificial_thunks): New method.
|
||||
(create_clone): Call expand_all_artificial_thunks.
|
||||
* ipa-cp.c (perhaps_add_new_callers): Call
|
||||
redirect_callee_duplicating_thunks instead of redirect_callee.
|
||||
Also call expand_all_artificial_thunks.
|
||||
|
||||
2014-12-05 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
|
||||
PR target/64056
|
||||
|
|
10
gcc/cgraph.h
10
gcc/cgraph.h
|
@ -908,6 +908,10 @@ public:
|
|||
thunks that are not lowered. */
|
||||
bool expand_thunk (bool output_asm_thunks, bool force_gimple_thunk);
|
||||
|
||||
/* Call expand_thunk on all callers that are thunks and analyze those
|
||||
nodes that were expanded. */
|
||||
void expand_all_artificial_thunks ();
|
||||
|
||||
/* Assemble thunks and aliases associated to node. */
|
||||
void assemble_thunks_and_aliases (void);
|
||||
|
||||
|
@ -1477,6 +1481,12 @@ struct GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"),
|
|||
call expression. */
|
||||
void redirect_callee (cgraph_node *n);
|
||||
|
||||
/* If the edge does not lead to a thunk, simply redirect it to N. Otherwise
|
||||
create one or more equivalent thunks for N and redirect E to the first in
|
||||
the chain. Note that it is then necessary to call
|
||||
n->expand_all_artificial_thunks once all callers are redirected. */
|
||||
void redirect_callee_duplicating_thunks (cgraph_node *n);
|
||||
|
||||
/* Make an indirect edge with an unknown callee an ordinary edge leading to
|
||||
CALLEE. DELTA is an integer constant that is to be added to the this
|
||||
pointer (first parameter) to compensate for skipping
|
||||
|
|
|
@ -370,28 +370,47 @@ duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
|
|||
CGRAPH_FREQ_BASE);
|
||||
e->call_stmt_cannot_inline_p = true;
|
||||
symtab->call_edge_duplication_hooks (thunk->callees, e);
|
||||
if (new_thunk->expand_thunk (false, false))
|
||||
{
|
||||
new_thunk->thunk.thunk_p = false;
|
||||
new_thunk->analyze ();
|
||||
}
|
||||
|
||||
symtab->call_cgraph_duplication_hooks (thunk, new_thunk);
|
||||
return new_thunk;
|
||||
}
|
||||
|
||||
/* If E does not lead to a thunk, simply redirect it to N. Otherwise create
|
||||
one or more equivalent thunks for N and redirect E to the first in the
|
||||
chain. */
|
||||
chain. Note that it is then necessary to call
|
||||
n->expand_all_artificial_thunks once all callers are redirected. */
|
||||
|
||||
void
|
||||
redirect_edge_duplicating_thunks (cgraph_edge *e, cgraph_node *n)
|
||||
cgraph_edge::redirect_callee_duplicating_thunks (cgraph_node *n)
|
||||
{
|
||||
cgraph_node *orig_to = e->callee->ultimate_alias_target ();
|
||||
cgraph_node *orig_to = callee->ultimate_alias_target ();
|
||||
if (orig_to->thunk.thunk_p)
|
||||
n = duplicate_thunk_for_node (orig_to, n);
|
||||
|
||||
e->redirect_callee (n);
|
||||
redirect_callee (n);
|
||||
}
|
||||
|
||||
/* Call expand_thunk on all callers that are thunks and if analyze those nodes
|
||||
that were expanded. */
|
||||
|
||||
void
|
||||
cgraph_node::expand_all_artificial_thunks ()
|
||||
{
|
||||
cgraph_edge *e;
|
||||
for (e = callers; e;)
|
||||
if (e->caller->thunk.thunk_p)
|
||||
{
|
||||
cgraph_node *thunk = e->caller;
|
||||
|
||||
e = e->next_caller;
|
||||
if (thunk->expand_thunk (false, false))
|
||||
{
|
||||
thunk->thunk.thunk_p = false;
|
||||
thunk->analyze ();
|
||||
}
|
||||
thunk->expand_all_artificial_thunks ();
|
||||
}
|
||||
else
|
||||
e = e->next_caller;
|
||||
}
|
||||
|
||||
/* Create node representing clone of N executed COUNT times. Decrease
|
||||
|
@ -483,8 +502,9 @@ cgraph_node::create_clone (tree decl, gcov_type gcov_count, int freq,
|
|||
if (!e->callee
|
||||
|| DECL_BUILT_IN_CLASS (e->callee->decl) != BUILT_IN_NORMAL
|
||||
|| DECL_FUNCTION_CODE (e->callee->decl) != BUILT_IN_UNREACHABLE)
|
||||
redirect_edge_duplicating_thunks (e, new_node);
|
||||
e->redirect_callee_duplicating_thunks (new_node);
|
||||
}
|
||||
new_node->expand_all_artificial_thunks ();
|
||||
|
||||
for (e = callees;e; e=e->next_callee)
|
||||
e->clone (new_node, e->call_stmt, e->lto_stmt_uid, count_scale,
|
||||
|
|
|
@ -3912,7 +3912,8 @@ perhaps_add_new_callers (cgraph_node *node, ipcp_value<valtype> *val)
|
|||
xstrdup (val->spec_node->name ()),
|
||||
val->spec_node->order);
|
||||
|
||||
cs->redirect_callee (val->spec_node);
|
||||
cs->redirect_callee_duplicating_thunks (val->spec_node);
|
||||
val->spec_node->expand_all_artificial_thunks ();
|
||||
redirected_sum += cs->count;
|
||||
}
|
||||
cs = get_next_cgraph_edge_clone (cs);
|
||||
|
|
Loading…
Reference in New Issue