summaryrefslogtreecommitdiff
path: root/gcc/cgraphunit.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2010-07-22 11:33:11 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2010-07-22 11:33:11 +0200
commit02ec698819babb12a43f548bb09d93fa3aea12ea (patch)
tree172d88f971d14aa07a31e2593610ff9314ed5781 /gcc/cgraphunit.c
parent8d6cd38823a1cde8549699340f3b331882502592 (diff)
downloadgcc-02ec698819babb12a43f548bb09d93fa3aea12ea.tar.gz
cgraphunit.c (verify_edge_count_and_frequency): New function.
2010-07-22 Martin Jambor <mjambor@suse.cz> * cgraphunit.c (verify_edge_count_and_frequency): New function. (verify_cgraph_node): Verify frequencies of indirect edges. * tree-inline.c (tree_function_versioning): Update frequencies of indirect edges. From-SVN: r162406
Diffstat (limited to 'gcc/cgraphunit.c')
-rw-r--r--gcc/cgraphunit.c68
1 files changed, 41 insertions, 27 deletions
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 7dce8e96799..0f3a6e23d00 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -570,6 +570,42 @@ clone_of_p (struct cgraph_node *node, struct cgraph_node *node2)
}
#endif
+/* Verify edge E count and frequency. */
+
+static bool
+verify_edge_count_and_frequency (struct cgraph_edge *e)
+{
+ bool error_found = false;
+ if (e->count < 0)
+ {
+ error ("caller edge count is negative");
+ error_found = true;
+ }
+ if (e->frequency < 0)
+ {
+ error ("caller edge frequency is negative");
+ error_found = true;
+ }
+ if (e->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->frequency
+ != compute_call_stmt_bb_frequency (e->caller->decl,
+ gimple_bb (e->call_stmt))))
+ {
+ error ("caller edge frequency %i does not match BB freqency %i",
+ e->frequency,
+ compute_call_stmt_bb_frequency (e->caller->decl,
+ gimple_bb (e->call_stmt)));
+ error_found = true;
+ }
+ return error_found;
+}
+
/* Verify cgraph nodes of given cgraph node. */
DEBUG_FUNCTION void
verify_cgraph_node (struct cgraph_node *node)
@@ -635,33 +671,8 @@ verify_cgraph_node (struct cgraph_node *node)
}
for (e = node->callers; e; e = e->next_caller)
{
- if (e->count < 0)
- {
- error ("caller edge count is negative");
- error_found = true;
- }
- if (e->frequency < 0)
- {
- error ("caller edge frequency is negative");
- error_found = true;
- }
- if (e->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->frequency
- != compute_call_stmt_bb_frequency (e->caller->decl,
- gimple_bb (e->call_stmt))))
- {
- error ("caller edge frequency %i does not match BB freqency %i",
- e->frequency,
- compute_call_stmt_bb_frequency (e->caller->decl,
- gimple_bb (e->call_stmt)));
- error_found = true;
- }
+ if (verify_edge_count_and_frequency (e))
+ error_found = true;
if (!e->inline_failed)
{
if (node->global.inlined_to
@@ -684,6 +695,9 @@ verify_cgraph_node (struct cgraph_node *node)
error_found = true;
}
}
+ for (e = node->indirect_calls; e; e = e->next_callee)
+ if (verify_edge_count_and_frequency (e))
+ error_found = true;
if (!node->callers && node->global.inlined_to)
{
error ("inlined_to pointer is set but no predecessors found");