aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2014-12-05 12:06:26 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2014-12-05 12:06:26 +0100
commit6a4bad955f8ab028190bbb4d3cf3c00721c26bfc (patch)
tree5535b89bdfdb34a70839578dacb6e9d89a13a6df
parent612b47110ab93289e9d7fb4751e9f46fbd7d3485 (diff)
downloadgcc-6a4bad955f8ab028190bbb4d3cf3c00721c26bfc.zip
gcc-6a4bad955f8ab028190bbb4d3cf3c00721c26bfc.tar.gz
gcc-6a4bad955f8ab028190bbb4d3cf3c00721c26bfc.tar.bz2
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
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/cgraph.h10
-rw-r--r--gcc/cgraphclones.c42
-rw-r--r--gcc/ipa-cp.c3
4 files changed, 57 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9e66e60..c0ee60b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 04318f5..54ee748 100644
--- a/gcc/cgraph.h
+++ b/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
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index 086dd92..1bf0477 100644
--- a/gcc/cgraphclones.c
+++ b/gcc/cgraphclones.c
@@ -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,
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index 3baa115..9b6784b 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -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);