profile-count.c (profile_count::to_cgraph_frequency, [...]): Check for compaibility...
authorJan Hubicka <hubicka@ucw.cz>
Fri, 29 Nov 2019 10:29:44 +0000 (11:29 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 29 Nov 2019 10:29:44 +0000 (10:29 +0000)
* 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

gcc/ChangeLog
gcc/cgraph.c
gcc/profile-count.c
gcc/profile-count.h

index 3eaa9acf7433691c803a541c26c2fcdaf157726b..9e0340c552af0a87868c83b7740fd69938ae2ee5 100644 (file)
@@ -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
index dd07516b83e8f7032efd9c5dea56e5fc8142375f..180d21e47969800c0382ab9dfed0c760113d4df7 100644 (file)
@@ -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
index fb978c634fde8152c1484f1e25b281c66e65baf3..81a969175d2b8bccf552537f4659baf019054e24 100644 (file)
@@ -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)
     {
index b79de83e4794fb9d548827b1a3bcdeee3c51780a..5a5c046005b184f0d0d6db709c7bc1fc51d0c80d 100644 (file)
@@ -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 ()
     {