summaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-26 19:56:25 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-26 19:56:25 +0000
commitbfbaf6bbe78de3bee8db1b303de9c0109e9c3f58 (patch)
treeb2926b95a08345ab4f4ab5ea78f628f989ec25e9 /gcc/cgraph.c
parente806c56f7d0d5d17b7fcd043ab8755952fb68fd1 (diff)
downloadgcc-bfbaf6bbe78de3bee8db1b303de9c0109e9c3f58.tar.gz
* cgraph.c (cgraph_update_edges_for_call_stmt_node): Do not bring
dead calls back to live. (cgraph_edge::verify_count_and_frequency): Move cgraph/cfg frequency cross check to ... (cgraph_node::verify_node): ... here; verify only callee edges, not caller. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221707 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c69
1 files changed, 48 insertions, 21 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 35164f9f406..0d2b826a5e7 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1515,6 +1515,15 @@ cgraph_update_edges_for_call_stmt_node (cgraph_node *node,
if (e)
{
+ /* Keep calls marked as dead dead. */
+ if (e->callee
+ && DECL_BUILT_IN_CLASS (e->callee->decl) == BUILT_IN_NORMAL
+ && DECL_FUNCTION_CODE (e->callee->decl) == BUILT_IN_UNREACHABLE)
+ {
+ node->get_edge (old_stmt)->set_call_stmt
+ (as_a <gcall *> (new_stmt));
+ return;
+ }
/* See if the edge is already there and has the correct callee. It
might be so because of indirect inlining has already updated
it. We also might've cloned and redirected the edge. */
@@ -2661,25 +2670,6 @@ cgraph_edge::verify_count_and_frequency ()
error ("caller edge frequency is too large");
error_found = true;
}
- 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. */
- && (frequency
- || (inline_edge_summary_vec.exists ()
- && ((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",
- frequency,
- compute_call_stmt_bb_frequency (caller->decl,
- gimple_bb (call_stmt)));
- error_found = true;
- }
return error_found;
}
@@ -2848,9 +2838,46 @@ cgraph_node::verify_node (void)
error_found = true;
}
}
+ for (e = callees; e; e = e->next_callee)
+ {
+ if (e->verify_count_and_frequency ())
+ error_found = true;
+ if (gimple_has_body_p (e->caller->decl)
+ && !e->caller->global.inlined_to
+ && !e->speculative
+ /* Optimized out calls are redirected to __builtin_unreachable. */
+ && (e->frequency
+ || e->callee->decl
+ != builtin_decl_implicit (BUILT_IN_UNREACHABLE))
+ && (e->frequency
+ != compute_call_stmt_bb_frequency (e->caller->decl,
+ gimple_bb (e->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)));
+ error_found = true;
+ }
+ }
for (e = indirect_calls; e; e = e->next_callee)
- if (e->verify_count_and_frequency ())
- error_found = true;
+ {
+ if (e->verify_count_and_frequency ())
+ error_found = true;
+ if (gimple_has_body_p (e->caller->decl)
+ && !e->caller->global.inlined_to
+ && !e->speculative
+ && (e->frequency
+ != compute_call_stmt_bb_frequency (e->caller->decl,
+ gimple_bb (e->call_stmt))))
+ {
+ error ("indirect call frequency %i does not match BB frequency %i",
+ e->frequency,
+ compute_call_stmt_bb_frequency (e->caller->decl,
+ gimple_bb (e->call_stmt)));
+ error_found = true;
+ }
+ }
if (!callers && global.inlined_to)
{
error ("inlined_to pointer is set but no predecessors found");