This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix profile count updates during tail merging
- From: Teresa Johnson <tejohnson at google dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: David Li <davidxl at google dot com>, Jan Hubicka <hubicka at ucw dot cz>
- Date: Tue, 15 Oct 2013 06:43:04 -0700
- Subject: [PATCH] Fix profile count updates during tail merging
- Authentication-results: sourceware.org; auth=none
This patch fixes a profile count insanity introduced by ssa tail
merging. When replacing bb1 with bb2, which has the same successors,
the bb counts were being merged, but the successor edge weights
were not.
Bootstrapped and tested on x86_64-unknown-linux-gnu. Ok for trunk?
Thanks,
Teresa
2013-10-15 Teresa Johnson <tejohnson@google.com>
* tree-ssa-tail-merge.c (replace_block_by): Update edge
weights during merging.
Index: tree-ssa-tail-merge.c
===================================================================
--- tree-ssa-tail-merge.c (revision 203389)
+++ tree-ssa-tail-merge.c (working copy)
@@ -1462,6 +1462,8 @@ static void
replace_block_by (basic_block bb1, basic_block bb2)
{
edge pred_edge;
+ edge e1;
+ edge_iterator ei;
unsigned int i;
gimple bb2_phi;
@@ -1488,6 +1490,15 @@ replace_block_by (basic_block bb1, basic_block bb2
pred_edge, UNKNOWN_LOCATION);
}
+ /* Merge the outgoing edge counts from bb1 onto bb2. */
+ FOR_EACH_EDGE (e1, ei, bb1->succs)
+ {
+ edge e2;
+ e2 = find_edge (bb2, e1->dest);
+ gcc_assert (e2);
+ e2->count += e1->count;
+ }
+
bb2->frequency += bb1->frequency;
if (bb2->frequency > BB_FREQ_MAX)
bb2->frequency = BB_FREQ_MAX;
--
Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413