aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2019-11-29 10:29:44 +0000
committerJan Hubicka <hubicka@ucw.cz>2019-11-29 10:29:44 +0000
commit750b7b378fa464895b8b2b80902a20dced126019 (patch)
tree25f8ed56b4c02634f18203902cde0e06f274974e
parent4e3b4daf9e6ae9d1008c355dfa2913f5e1a70706 (diff)
* 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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@278835 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cgraph.c21
-rw-r--r--gcc/profile-count.c2
-rw-r--r--gcc/profile-count.h12
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3eaa9acf743..9e0340c552a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2019-11-29 Jan Hubicka <hubicka@ucw.cz>
+
+ * 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 <rguenther@suse.de>
PR tree-optimization/92715
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index dd07516b83e..180d21e4796 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -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");
@@ -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)
{
@@ -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
diff --git a/gcc/profile-count.c b/gcc/profile-count.c
index fb978c634fd..81a969175d2 100644
--- a/gcc/profile-count.c
+++ b/gcc/profile-count.c
@@ -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;
@@ -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)
{
diff --git a/gcc/profile-count.h b/gcc/profile-count.h
index b79de83e479..5a5c046005b 100644
--- a/gcc/profile-count.h
+++ b/gcc/profile-count.h
@@ -700,6 +700,7 @@ private:
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
@@ -711,9 +712,18 @@ private:
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 ()
{