aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2015-01-12 09:47:26 +0100
committerMartin Liska <marxin@gcc.gnu.org>2015-01-12 08:47:26 +0000
commit90988f773c8e516007ead0d0d602a7c1708ddc23 (patch)
treeb6f94f7e64d65df1361e011532e113c8e06636ab /gcc/cgraph.c
parent6e7bdfacf2a5fe99a2d5eb31a860eb2ba681554b (diff)
downloadgcc-90988f773c8e516007ead0d0d602a7c1708ddc23.zip
gcc-90988f773c8e516007ead0d0d602a7c1708ddc23.tar.gz
gcc-90988f773c8e516007ead0d0d602a7c1708ddc23.tar.bz2
cgraph_edge refactoring.
* cgraph.c (cgraph_edge::remove_callee): Move function to header file for being inlined. (cgraph_set_edge_callee): Delete. (cgraph_edge::redirect_callee): Move function to header file for being inlined. (cgraph_edge::make_direct): Use new function. (cgraph_edge::dump_edge_flags): New function created from static dump_edge_flags function. (cgraph_node::dump): Use new function. (cgraph_edge::verify_count_and_frequency): New function created from verify_edge_count_and_frequency. (cgraph_edge::verify_corresponds_to_fndecl): New function created from verify_edge_corresponds_to_fndecl. (verify_edge_corresponds_to_fndecl): Delete. (cgraph_node::verify_node): Use new function. * cgraph.h (cgraph_edge::set_callee): New function. (cgraph_edge::dump_edge_flags): Likewise. (cgraph_edge::verify_corresponds_to_fndecl): Likewise. From-SVN: r219448
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c135
1 files changed, 46 insertions, 89 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 4770a6c..f3f7fec 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -965,20 +965,6 @@ cgraph_node::create_indirect_edge (gcall *call_stmt, int ecf_flags,
return edge;
}
-/* Remove the edge from the list of the callers of the callee. */
-
-void
-cgraph_edge::remove_callee (void)
-{
- gcc_assert (!indirect_unknown_callee);
- if (prev_caller)
- prev_caller->next_caller = next_caller;
- if (next_caller)
- next_caller->prev_caller = prev_caller;
- if (!prev_caller)
- callee->callers = next_caller;
-}
-
/* Remove the edge from the list of the callees of the caller. */
void
@@ -1037,20 +1023,6 @@ cgraph_edge::remove (void)
symtab->free_edge (this);
}
-/* Set callee of call graph edge E and add it to the corresponding set of
- callers. */
-
-static void
-cgraph_set_edge_callee (cgraph_edge *e, cgraph_node *n)
-{
- e->prev_caller = NULL;
- if (n->callers)
- n->callers->prev_caller = e;
- e->next_caller = n->callers;
- n->callers = e;
- e->callee = n;
-}
-
/* Turn edge into speculative call calling N2. Update
the profile so the direct call is taken COUNT times
with FREQUENCY.
@@ -1165,19 +1137,6 @@ cgraph_edge::speculative_call_info (cgraph_edge *&direct,
gcc_assert (e && e2 && ref);
}
-/* Redirect callee of the edge to N. The function does not update underlying
- call expression. */
-
-void
-cgraph_edge::redirect_callee (cgraph_node *n)
-{
- /* Remove from callers list of the current callee. */
- remove_callee ();
-
- /* Insert to callers list of the new callee. */
- cgraph_set_edge_callee (this, n);
-}
-
/* Speculative call edge turned out to be direct call to CALLE_DECL.
Remove the speculative call sequence and return edge representing the call.
It is up to caller to redirect the call as appropriate. */
@@ -1284,7 +1243,7 @@ cgraph_edge::make_direct (cgraph_node *callee)
caller->callees = edge;
/* Insert to callers list of the new callee. */
- cgraph_set_edge_callee (edge, callee);
+ edge->set_callee (callee);
if (call_stmt)
call_stmt_cannot_inline_p
@@ -1948,24 +1907,22 @@ cgraph_inline_failed_type (cgraph_inline_failed_t reason)
const char * const cgraph_availability_names[] =
{"unset", "not_available", "overwritable", "available", "local"};
-/* Output flags of edge E. */
+/* Output flags of edge to a file F. */
-static void
-dump_edge_flags (FILE *f, struct cgraph_edge *edge)
+void
+cgraph_edge::dump_edge_flags (FILE *f)
{
- if (edge->speculative)
+ if (speculative)
fprintf (f, "(speculative) ");
- if (!edge->inline_failed)
+ if (!inline_failed)
fprintf (f, "(inlined) ");
- if (edge->indirect_inlining_edge)
+ if (indirect_inlining_edge)
fprintf (f, "(indirect_inlining) ");
- if (edge->count)
- fprintf (f, "(%"PRId64"x) ",
- (int64_t)edge->count);
- if (edge->frequency)
- fprintf (f, "(%.2f per call) ",
- edge->frequency / (double)CGRAPH_FREQ_BASE);
- if (edge->can_throw_external)
+ if (count)
+ fprintf (f, "(%"PRId64"x) ", (int64_t)count);
+ if (frequency)
+ fprintf (f, "(%.2f per call) ", frequency / (double)CGRAPH_FREQ_BASE);
+ if (can_throw_external)
fprintf (f, "(can throw external) ");
}
@@ -2057,7 +2014,7 @@ cgraph_node::dump (FILE *f)
{
fprintf (f, "%s/%i ", edge->caller->asm_name (),
edge->caller->order);
- dump_edge_flags (f, edge);
+ edge->dump_edge_flags (f);
}
fprintf (f, "\n Calls: ");
@@ -2065,7 +2022,7 @@ cgraph_node::dump (FILE *f)
{
fprintf (f, "%s/%i ", edge->callee->asm_name (),
edge->callee->order);
- dump_edge_flags (f, edge);
+ edge->dump_edge_flags (f);
}
fprintf (f, "\n");
@@ -2079,7 +2036,7 @@ cgraph_node::dump (FILE *f)
}
else
fprintf (f, " Indirect call");
- dump_edge_flags (f, edge);
+ edge->dump_edge_flags (f);
if (edge->indirect_info->param_index != -1)
{
fprintf (f, " of param:%i", edge->indirect_info->param_index);
@@ -2638,44 +2595,44 @@ clone_of_p (cgraph_node *node, cgraph_node *node2)
return node2 != NULL;
}
-/* Verify edge E count and frequency. */
+/* Verify edge count and frequency. */
-static bool
-verify_edge_count_and_frequency (cgraph_edge *e)
+bool
+cgraph_edge::verify_count_and_frequency ()
{
bool error_found = false;
- if (e->count < 0)
+ if (count < 0)
{
error ("caller edge count is negative");
error_found = true;
}
- if (e->frequency < 0)
+ if (frequency < 0)
{
error ("caller edge frequency is negative");
error_found = true;
}
- if (e->frequency > CGRAPH_FREQ_MAX)
+ if (frequency > CGRAPH_FREQ_MAX)
{
error ("caller edge frequency is too large");
error_found = true;
}
- if (gimple_has_body_p (e->caller->decl)
- && !e->caller->global.inlined_to
- && !e->speculative
+ if (gimple_has_body_p (caller->decl)
+ && !caller->global.inlined_to
+ && !speculative
/* FIXME: Inline-analysis sets frequency to 0 when edge is optimized out.
Remove this once edges are actually removed from the function at that time. */
- && (e->frequency
+ && (frequency
|| (inline_edge_summary_vec.exists ()
- && ((inline_edge_summary_vec.length () <= (unsigned) e->uid)
- || !inline_edge_summary (e)->predicate)))
- && (e->frequency
- != compute_call_stmt_bb_frequency (e->caller->decl,
- gimple_bb (e->call_stmt))))
+ && ((inline_edge_summary_vec.length () <= (unsigned) uid)
+ || !inline_edge_summary (this)->predicate)))
+ && (frequency
+ != compute_call_stmt_bb_frequency (caller->decl,
+ gimple_bb (call_stmt))))
{
error ("caller edge frequency %i does not match BB frequency %i",
- e->frequency,
- compute_call_stmt_bb_frequency (e->caller->decl,
- gimple_bb (e->call_stmt)));
+ frequency,
+ compute_call_stmt_bb_frequency (caller->decl,
+ gimple_bb (call_stmt)));
error_found = true;
}
return error_found;
@@ -2700,15 +2657,15 @@ cgraph_debug_gimple_stmt (function *this_cfun, gimple stmt)
current_function_decl = NULL;
}
-/* Verify that call graph edge E corresponds to DECL from the associated
+/* Verify that call graph edge corresponds to DECL from the associated
statement. Return true if the verification should fail. */
-static bool
-verify_edge_corresponds_to_fndecl (cgraph_edge *e, tree decl)
+bool
+cgraph_edge::verify_corresponds_to_fndecl (tree decl)
{
cgraph_node *node;
- if (!decl || e->callee->global.inlined_to)
+ if (!decl || callee->global.inlined_to)
return false;
if (symtab->state == LTO_STREAMING)
return false;
@@ -2722,20 +2679,20 @@ verify_edge_corresponds_to_fndecl (cgraph_edge *e, tree decl)
|| node->body_removed
|| node->in_other_partition
|| node->icf_merged
- || e->callee->in_other_partition)
+ || callee->in_other_partition)
return false;
node = node->ultimate_alias_target ();
/* Optimizers can redirect unreachable calls or calls triggering undefined
behaviour to builtin_unreachable. */
- if (DECL_BUILT_IN_CLASS (e->callee->decl) == BUILT_IN_NORMAL
- && DECL_FUNCTION_CODE (e->callee->decl) == BUILT_IN_UNREACHABLE)
+ if (DECL_BUILT_IN_CLASS (callee->decl) == BUILT_IN_NORMAL
+ && DECL_FUNCTION_CODE (callee->decl) == BUILT_IN_UNREACHABLE)
return false;
- if (e->callee->former_clone_of != node->decl
- && (node != e->callee->ultimate_alias_target ())
- && !clone_of_p (node, e->callee))
+ if (callee->former_clone_of != node->decl
+ && (node != callee->ultimate_alias_target ())
+ && !clone_of_p (node, callee))
return true;
else
return false;
@@ -2815,7 +2772,7 @@ cgraph_node::verify_node (void)
bool check_comdat = comdat_local_p ();
for (e = callers; e; e = e->next_caller)
{
- if (verify_edge_count_and_frequency (e))
+ if (e->verify_count_and_frequency ())
error_found = true;
if (check_comdat
&& !in_same_comdat_group_p (e->caller))
@@ -2847,7 +2804,7 @@ cgraph_node::verify_node (void)
}
}
for (e = indirect_calls; e; e = e->next_callee)
- if (verify_edge_count_and_frequency (e))
+ if (e->verify_count_and_frequency ())
error_found = true;
if (!callers && global.inlined_to)
{
@@ -3052,7 +3009,7 @@ cgraph_node::verify_node (void)
}
if (!e->indirect_unknown_callee)
{
- if (verify_edge_corresponds_to_fndecl (e, decl))
+ if (e->verify_corresponds_to_fndecl (decl))
{
error ("edge points to wrong declaration:");
debug_tree (e->callee->decl);