public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jan Hubicka <hubicka@ucw.cz>
To: gcc-patches@gcc.gnu.org
Subject: Fix profile update in tail merging
Date: Fri, 16 Jun 2017 17:47:00 -0000	[thread overview]
Message-ID: <20170616174746.GF59896@kam.mff.cuni.cz> (raw)

Hi,
profile updating in tail merging is completely wrong when profile feedback
is missing or 0.  This fixes it hopefully reasonably.
Bootstrapped/regtested x86_64-linux.

Honza

	* tree-ssa-tail-merge.c (replace_block_by): Fix profile updating.
Index: tree-ssa-tail-merge.c
===================================================================
--- tree-ssa-tail-merge.c	(revision 249244)
+++ tree-ssa-tail-merge.c	(working copy)
@@ -1555,29 +1555,51 @@ replace_block_by (basic_block bb1, basic
 		   pred_edge, UNKNOWN_LOCATION);
     }
 
-  bb2->frequency += bb1->frequency;
-  if (bb2->frequency > BB_FREQ_MAX)
-    bb2->frequency = BB_FREQ_MAX;
-
   bb2->count += bb1->count;
 
   /* Merge the outgoing edge counts from bb1 onto bb2.  */
   profile_count out_sum = profile_count::zero ();
+  int out_freq_sum = 0;
+
+  /* Recompute the edge probabilities from the new merged edge count.
+     Use the sum of the new merged edge counts computed above instead
+     of bb2's merged count, in case there are profile count insanities
+     making the bb count inconsistent with the edge weights.  */
+  FOR_EACH_EDGE (e1, ei, bb1->succs)
+    {
+      if (e1->count.initialized_p ())
+	out_sum += e1->count;
+      out_freq_sum += EDGE_FREQUENCY (e1);
+    }
+  FOR_EACH_EDGE (e1, ei, bb2->succs)
+    {
+      if (e1->count.initialized_p ())
+	out_sum += e1->count;
+      out_freq_sum += EDGE_FREQUENCY (e1);
+    }
+
   FOR_EACH_EDGE (e1, ei, bb1->succs)
     {
       e2 = find_edge (bb2, e1->dest);
       gcc_assert (e2);
       e2->count += e1->count;
+      if (out_sum > 0 && e2->count.initialized_p ())
+	{
+	  e2->probability = e2->count.probability_in (bb2->count);
+	}
+      else if (bb1->frequency && bb2->frequency)
+	e2->probability = e1->probability;
+      else if (bb2->frequency && !bb1->frequency)
+	;
+      else if (out_freq_sum)
+	e2->probability = GCOV_COMPUTE_SCALE (EDGE_FREQUENCY (e1)
+					      + EDGE_FREQUENCY (e2),
+					      out_freq_sum);
       out_sum += e2->count;
     }
-  /* Recompute the edge probabilities from the new merged edge count.
-     Use the sum of the new merged edge counts computed above instead
-     of bb2's merged count, in case there are profile count insanities
-     making the bb count inconsistent with the edge weights.  */
-  FOR_EACH_EDGE (e2, ei, bb2->succs)
-    {
-      e2->probability = e2->count.probability_in (out_sum);
-    }
+  bb2->frequency += bb1->frequency;
+  if (bb2->frequency > BB_FREQ_MAX)
+    bb2->frequency = BB_FREQ_MAX;
 
   /* Move over any user labels from bb1 after the bb2 labels.  */
   gimple_stmt_iterator gsi1 = gsi_start_bb (bb1);

                 reply	other threads:[~2017-06-16 17:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170616174746.GF59896@kam.mff.cuni.cz \
    --to=hubicka@ucw.cz \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).