Skip to content

Commit

Permalink
profile-count.c (profile_count::to_cgraph_frequency, [...]): Check fo…
Browse files Browse the repository at this point in the history
…r compaibility of counts.

	* profile-count.c (profile_count::to_cgraph_frequency,
	profile_count::to_sreal_scale): Check for compaibility of counts.
	* profile-count.h (compatible_p): Make public; add checking for
	global0 versus global types.
	* cgraph.c (cgraph_node::verify_node): Verify count compatibility.

From-SVN: r278835
  • Loading branch information
janhubicka authored and Jan Hubicka committed Nov 29, 2019
1 parent 60178a3 commit db51f62
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 1 deletion.
8 changes: 8 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
2019-11-29 Jan Hubicka <[email protected]>

* profile-count.c (profile_count::to_cgraph_frequency,
profile_count::to_sreal_scale): Check for compaibility of counts.
* profile-count.h (compatible_p): Make public; add checking for
global0 versus global types.
* cgraph.c (cgraph_node::verify_node): Verify count compatibility.

2019-11-29 Richard Biener <[email protected]>

PR tree-optimization/92715
Expand Down
21 changes: 21 additions & 0 deletions gcc/cgraph.c
Original file line number Diff line number Diff line change
Expand Up @@ -3061,6 +3061,13 @@ cgraph_node::verify_node (void)
error ("inline clone in same comdat group list");
error_found = true;
}
if (inlined_to && !count.compatible_p (inlined_to->count))
{
error ("inline clone count is not compatible");
count.debug ();
inlined_to->count.debug ();
error_found = true;
}
if (!definition && !in_other_partition && local)
{
error ("local symbols must be defined");
Expand Down Expand Up @@ -3089,6 +3096,13 @@ cgraph_node::verify_node (void)
identifier_to_locale (e->caller->name ()));
error_found = true;
}
if (!e->count.compatible_p (count))
{
error ("edge count is not compatible with function count");
e->count.debug ();
count.debug ();
error_found = true;
}
if (!e->indirect_unknown_callee
|| !e->indirect_info)
{
Expand Down Expand Up @@ -3137,6 +3151,13 @@ cgraph_node::verify_node (void)
{
if (e->verify_count ())
error_found = true;
if (!e->count.compatible_p (count))
{
error ("edge count is not compatible with function count");
e->count.debug ();
count.debug ();
error_found = true;
}
if (gimple_has_body_p (e->caller->decl)
&& !e->caller->inlined_to
&& !e->speculative
Expand Down
2 changes: 2 additions & 0 deletions gcc/profile-count.c
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ profile_count::to_cgraph_frequency (profile_count entry_bb_count) const
return 0;
gcc_checking_assert (entry_bb_count.initialized_p ());
uint64_t scale;
gcc_checking_assert (compatible_p (entry_bb_count));
if (!safe_scale_64bit (!entry_bb_count.m_val ? m_val + 1 : m_val,
CGRAPH_FREQ_BASE, MAX (1, entry_bb_count.m_val), &scale))
return CGRAPH_FREQ_MAX;
Expand Down Expand Up @@ -328,6 +329,7 @@ profile_count::to_sreal_scale (profile_count in, bool *known) const
return 0;
if (m_val == in.m_val)
return 1;
gcc_checking_assert (compatible_p (in));

if (!in.m_val)
{
Expand Down
12 changes: 11 additions & 1 deletion gcc/profile-count.h
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,7 @@ struct GTY(()) profile_count
uint64_t UINT64_BIT_FIELD_ALIGN m_val : n_bits;
#undef UINT64_BIT_FIELD_ALIGN
enum profile_quality m_quality : 3;
public:

/* Return true if both values can meaningfully appear in single function
body. We have either all counters in function local or global, otherwise
Expand All @@ -711,9 +712,18 @@ struct GTY(()) profile_count
if (*this == zero ()
|| other == zero ())
return true;
/* Do not allow nonzero global profile together with local guesses
that are globally0. */
if (ipa ().nonzero_p ()
&& !(other.ipa () == other))
return false;
if (other.ipa ().nonzero_p ()
&& !(ipa () == *this))
return false;

return ipa_p () == other.ipa_p ();
}
public:

/* Used for counters which are expected to be never executed. */
static profile_count zero ()
{
Expand Down

0 comments on commit db51f62

Please sign in to comment.