From 901d3ddcb5a162a90483637923a847bb406009d5 Mon Sep 17 00:00:00 2001 From: tejohnson Date: Wed, 13 Nov 2013 21:51:44 +0000 Subject: [PATCH] 2013-11-13 Teresa Johnson PR ipa/58862 * predict.c (drop_profile): Error is currently too strict. (handle_missing_profiles): Pass call_count to drop_profile. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204756 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/predict.c | 32 ++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bf8306dd58a..cea26ec2f22 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2013-11-13 Teresa Johnson PR ipa/58862 + * predict.c (drop_profile): Error is currently too strict. + (handle_missing_profiles): Pass call_count to drop_profile. + +2013-11-13 Teresa Johnson + + PR ipa/58862 * ipa-inline.c (edge_badness): Fix overflow. 2013-11-13 Vladimir Makarov diff --git a/gcc/predict.c b/gcc/predict.c index 2a500eaa78d..3cfa258abed 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -2766,12 +2766,17 @@ estimate_loops (void) } /* Drop the profile for NODE to guessed, and update its frequency based on - whether it is expected to be HOT. */ + whether it is expected to be hot given the CALL_COUNT. */ static void -drop_profile (struct cgraph_node *node, bool hot) +drop_profile (struct cgraph_node *node, gcov_type call_count) { struct function *fn = DECL_STRUCT_FUNCTION (node->decl); + /* In the case where this was called by another function with a + dropped profile, call_count will be 0. Since there are no + non-zero call counts to this function, we don't know for sure + whether it is hot, and therefore it will be marked normal below. */ + bool hot = maybe_hot_count_p (NULL, call_count); if (dump_file) fprintf (dump_file, @@ -2781,8 +2786,13 @@ drop_profile (struct cgraph_node *node, bool hot) /* We only expect to miss profiles for functions that are reached via non-zero call edges in cases where the function may have been linked from another module or library (COMDATs and extern - templates). See the comments below for handle_missing_profiles. */ - if (!DECL_COMDAT (node->decl) && !DECL_EXTERNAL (node->decl)) + templates). See the comments below for handle_missing_profiles. + Also, only warn in cases where the missing counts exceed the + number of training runs. In certain cases with an execv followed + by a no-return call the profile for the no-return call is not + dumped and there can be a mismatch. */ + if (!DECL_COMDAT (node->decl) && !DECL_EXTERNAL (node->decl) + && call_count > profile_info->runs) { if (flag_profile_correction) { @@ -2792,8 +2802,8 @@ drop_profile (struct cgraph_node *node, bool hot) cgraph_node_name (node), node->order); } else - error ("Missing counts for called function %s/%i", - cgraph_node_name (node), node->order); + warning (0, "Missing counts for called function %s/%i", + cgraph_node_name (node), node->order); } profile_status_for_function (fn) @@ -2839,9 +2849,7 @@ handle_missing_profiles (void) && fn && fn->cfg && (call_count * unlikely_count_fraction >= profile_info->runs)) { - bool maybe_hot = maybe_hot_count_p (NULL, call_count); - - drop_profile (node, maybe_hot); + drop_profile (node, call_count); worklist.safe_push (node); } } @@ -2863,11 +2871,7 @@ handle_missing_profiles (void) if (DECL_COMDAT (callee->decl) && fn && fn->cfg && profile_status_for_function (fn) == PROFILE_READ) { - /* Since there are no non-0 call counts to this function, - we don't know for sure whether it is hot. Indicate to - the drop_profile routine that function should be marked - normal, rather than hot. */ - drop_profile (node, false); + drop_profile (node, 0); worklist.safe_push (callee); } } -- 2.11.4.GIT