* [PATCH] Fixup indirect edge frequencies
@ 2010-07-21 13:00 Martin Jambor
2010-07-21 19:55 ` Jan Hubicka
0 siblings, 1 reply; 2+ messages in thread
From: Martin Jambor @ 2010-07-21 13:00 UTC (permalink / raw)
To: GCC Patches; +Cc: Jan Hubicka
Hi,
the patch below adds missing edge frequencies updates which are
necessary for my devirtualization patches not to ICEs when it touches
functions created with cgraph_function_versioning.
Bootstrapped and tested on x86_64-linux. OK for trunk?
Thanks,
Martin
2010-07-20 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.
Index: icln/gcc/cgraphunit.c
===================================================================
--- icln.orig/gcc/cgraphunit.c
+++ icln/gcc/cgraphunit.c
@@ -570,6 +570,42 @@ clone_of_p (struct cgraph_node *node, st
}
#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 *
}
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 *
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");
Index: icln/gcc/tree-inline.c
===================================================================
--- icln.orig/gcc/tree-inline.c
+++ icln/gcc/tree-inline.c
@@ -5184,7 +5184,15 @@ tree_function_versioning (tree old_decl,
for (e = new_version_node->callees; e; e = e->next_callee)
{
basic_block bb = gimple_bb (e->call_stmt);
- e->frequency = compute_call_stmt_bb_frequency (current_function_decl, bb);
+ e->frequency = compute_call_stmt_bb_frequency (current_function_decl,
+ bb);
+ e->count = bb->count;
+ }
+ for (e = new_version_node->indirect_calls; e; e = e->next_callee)
+ {
+ basic_block bb = gimple_bb (e->call_stmt);
+ e->frequency = compute_call_stmt_bb_frequency (current_function_decl,
+ bb);
e->count = bb->count;
}
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Fixup indirect edge frequencies
2010-07-21 13:00 [PATCH] Fixup indirect edge frequencies Martin Jambor
@ 2010-07-21 19:55 ` Jan Hubicka
0 siblings, 0 replies; 2+ messages in thread
From: Jan Hubicka @ 2010-07-21 19:55 UTC (permalink / raw)
To: GCC Patches, Jan Hubicka
> Hi,
>
> the patch below adds missing edge frequencies updates which are
> necessary for my devirtualization patches not to ICEs when it touches
> functions created with cgraph_function_versioning.
>
> Bootstrapped and tested on x86_64-linux. OK for trunk?
>
> Thanks,
>
> Martin
>
> 2010-07-20 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.
OK, thanks!
Honza
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-07-21 19:55 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-07-21 13:00 [PATCH] Fixup indirect edge frequencies Martin Jambor
2010-07-21 19:55 ` Jan Hubicka
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).