re PR ipa/58862 (LTO profiledbootstrap failure: lto1: ICE in edge_badness, at ipa-inline.c:1008)

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.

From-SVN: r204756
This commit is contained in:
Teresa Johnson 2013-11-13 21:51:44 +00:00 committed by Teresa Johnson
parent 51f5c118c5
commit 4c7d077736
2 changed files with 24 additions and 14 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -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);
}
}