summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortejohnson <tejohnson@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-13 21:51:44 +0000
committertejohnson <tejohnson@138bc75d-0d04-0410-961f-82ee72b054a4>2013-11-13 21:51:44 +0000
commit901d3ddcb5a162a90483637923a847bb406009d5 (patch)
treecf2efb018f89a954723c93c6826022b451cfbe19
parent4a45bef0973cb646462beeda4133628304e9b77b (diff)
downloadgcc-901d3ddcb5a162a90483637923a847bb406009d5.tar.gz
2013-11-13 Teresa Johnson <tejohnson@google.com>
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/predict.c32
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 <tejohnson@google.com>
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 <tejohnson@google.com>
+
+ PR ipa/58862
* ipa-inline.c (edge_badness): Fix overflow.
2013-11-13 Vladimir Makarov <vmakarov@redhat.com>
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);
}
}