re PR ipa/82879 (ICE in max, at profile-count.h:889)
authorJan Hubicka <hubicka@ucw.cz>
Thu, 9 Nov 2017 14:05:14 +0000 (15:05 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 9 Nov 2017 14:05:14 +0000 (14:05 +0000)
PR ipa/82879
* ipa-inline-transform.c (update_noncloned_frequencies): Use
profile_count::adjust_for_ipa_scaling.
* tree-inline.c (copy_bb, copy_cfg_body): Likewise.
* profile-count.c (profile_count::adjust_for_ipa_scaling): New member
function.
* profile-count.h (profile_count::adjust_for_ipa_scaling): Declare.

From-SVN: r254582

gcc/ChangeLog
gcc/ipa-inline-transform.c
gcc/profile-count.c
gcc/profile-count.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr82879.c [new file with mode: 0644]
gcc/tree-inline.c

index df371fd5391412ae62c9980c06a9ae532fad161f..0953b4a36810c49446e3e9f468dfce6ecd62b698 100644 (file)
@@ -1,3 +1,13 @@
+2017-11-09  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/82879
+       * ipa-inline-transform.c (update_noncloned_frequencies): Use
+       profile_count::adjust_for_ipa_scaling.
+       * tree-inline.c (copy_bb, copy_cfg_body): Likewise.
+       * profile-count.c (profile_count::adjust_for_ipa_scaling): New member
+       function.
+       * profile-count.h (profile_count::adjust_for_ipa_scaling): Declare.
+
 2017-11-09  Jakub Jelinek  <jakub@redhat.com>
 
        * gimple-ssa-store-merging.c (count_multiple_uses): New function.
index e367df7df0e5c507f7ebf2bd8da86462cf82b4b4..b2363e230439b551a87a68fd52059d5a7d48e20f 100644 (file)
@@ -60,17 +60,7 @@ update_noncloned_frequencies (struct cgraph_node *node,
 {
   struct cgraph_edge *e;
 
-  /* We always must scale to be sure counters end up compatible.
-     If den is zero, just force it nonzero and hope for reasonable
-     approximation.
-     When num is forced nonzero, also update den, so we do not scale profile
-     to 0.   */
-  if (!(num == den)
-      && !(den.force_nonzero () == den))
-    {
-      den = den.force_nonzero ();
-      num = num.force_nonzero ();
-    }
+  profile_count::adjust_for_ipa_scaling (&num, &den);
 
   /* We do not want to ignore high loop nest after freq drops to 0.  */
   if (!freq_scale)
index d70314046452db2e15345de25d7d5ae58746ad12..9c57323db6e3c09db3985cc264fabdcb1907bbc7 100644 (file)
@@ -255,3 +255,29 @@ profile_count::to_cgraph_frequency (profile_count entry_bb_count) const
     return CGRAPH_FREQ_MAX;
   return MIN (scale, CGRAPH_FREQ_MAX);
 }
+
+/* We want to scale profile across function boundary from NUM to DEN.
+   Take care of the side case when DEN is zeros.  We still want to behave
+   sanely here which means
+     - scale to profile_count::zero () if NUM is profile_count::zero
+     - do not affect anything if NUM == DEN
+     - preserve counter value but adjust quality in other cases.  */
+
+void
+profile_count::adjust_for_ipa_scaling (profile_count *num,
+                                      profile_count *den)
+{
+  /* Scaling is no-op if NUM and DEN are the same.  */
+  if (*num == *den)
+    return;
+  /* Scaling to zero is always zeor.  */
+  if (*num == profile_count::zero ())
+    return;
+  /* If den is non-zero we are safe.  */
+  if (den->force_nonzero () == *den)
+    return;
+  /* Force both to non-zero so we do not push profiles to 0 when
+     both num == 0 and den == 0.  */
+  *den = den->force_nonzero ();
+  *num = num->force_nonzero ();
+}
index f16bbcb2b9f77cf7838f95df3305d627302622d4..aa42b4e2397ad8ef07ca963daead459112ec7b72 100644 (file)
@@ -1044,6 +1044,11 @@ public:
   /* Return true if THIS is known to differ significantly from OTHER.  */
   bool differs_from_p (profile_count other) const;
 
+  /* We want to scale profile across function boundary from NUM to DEN.
+     Take care of the side case when NUM and DEN are zeros of incompatible
+     kinds.  */
+  static void adjust_for_ipa_scaling (profile_count *num, profile_count *den);
+
   /* LTO streaming support.  */
   static profile_count stream_in (struct lto_input_block *);
   void stream_out (struct output_block *);
index e7867ec6b85b67e8ebb6c694ab6e6c7744fa5709..7741f7fd7b35b41952ebc98a9d31df949f744486 100644 (file)
@@ -1,3 +1,7 @@
+2017-11-09  Jan Hubicka  <hubicka@ucw.cz>
+
+       * gcc.c-torture/compile/pr82879.c: New testcase.
+
 2017-11-09  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/82902
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr82879.c b/gcc/testsuite/gcc.c-torture/compile/pr82879.c
new file mode 100644 (file)
index 0000000..fad3fed
--- /dev/null
@@ -0,0 +1,11 @@
+int a, b;
+static __attribute__((cold)) void fn1() {
+  for (;;)
+    for (; a;)
+      ;
+}
+void fn2() {
+  if (b)
+    fn1();
+}
+
index 7ef107247b55400cf7b7f46280107dcb187c3aba..fc5d2c703abc00110f259654c6af83172449aace 100644 (file)
@@ -1771,17 +1771,7 @@ copy_bb (copy_body_data *id, basic_block bb,
   tree decl;
   basic_block prev;
 
-  /* We always must scale to be sure counters end up compatible.
-     If den is zero, just force it nonzero and hope for reasonable
-     approximation.
-     When num is forced nonzero, also update den, so we do not scale profile
-     to 0.   */
-  if (!(num == den)
-      && !(den.force_nonzero () == den))
-    {
-      den = den.force_nonzero ();
-      num = num.force_nonzero ();
-    }
+  profile_count::adjust_for_ipa_scaling (&num, &den);
 
   /* Search for previous copied basic block.  */
   prev = bb->prev_bb;
@@ -2698,17 +2688,7 @@ copy_cfg_body (copy_body_data * id, profile_count,
   profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count;
   profile_count num = entry_block_map->count;
 
-  /* We always must scale to be sure counters end up compatible.
-     If den is zero, just force it nonzero and hope for reasonable
-     approximation.
-     When num is forced nonzero, also update den, so we do not scale profile
-     to 0.   */
-  if (!(num == den)
-      && !(den.force_nonzero () == den))
-    {
-      den = den.force_nonzero ();
-      num = num.force_nonzero ();
-    }
+  profile_count::adjust_for_ipa_scaling (&num, &den);
 
   cfun_to_copy = id->src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);