Richard,
this patch fixes up the basic block frequencies after merging 2 bbs in
tail_merge_optimize, and prevents tree-dump messages like:
'Invalid sum of incoming frequencies x, should be y'.
Bootstrapped and reg-tested on x86_64 and i686, build and reg-tested on ARM and
MIPS.
OK for trunk?
Thanks,
- Tom
2011-11-15 Tom de Vries <[email protected]>
* tree-ssa-tail-merge.c (replace_block_by): Add frequency of bb2 to bb1.
* gcc.dg/pr43864.c: Check for absence of 'Invalid sum' in pre tree-dump.
* gcc.dg/pr43864-2.c: Same.
* gcc.dg/pr43864-3.c: Same.
* gcc.dg/pr43864-4.c: Same.
Index: gcc/tree-ssa-tail-merge.c
===================================================================
--- gcc/tree-ssa-tail-merge.c (revision 181377)
+++ gcc/tree-ssa-tail-merge.c (working copy)
@@ -1396,6 +1396,9 @@ replace_block_by (basic_block bb1, basic
pred_edge, UNKNOWN_LOCATION);
}
+ bb2->frequency += bb1->frequency;
+ bb1->frequency = 0;
+
/* Do updates that use bb1, before deleting bb1. */
release_last_vdef (bb1);
same_succ_flush_bb (bb1);
Index: gcc/testsuite/gcc.dg/pr43864-2.c
===================================================================
--- gcc/testsuite/gcc.dg/pr43864-2.c (revision 181377)
+++ gcc/testsuite/gcc.dg/pr43864-2.c (working copy)
@@ -19,4 +19,5 @@ f (int c, int b, int d)
/* { dg-final { scan-tree-dump-times "if " 0 "pre"} } */
/* { dg-final { scan-tree-dump-times "_.*\\\+.*_" 1 "pre"} } */
+/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */
/* { dg-final { cleanup-tree-dump "pre" } } */
Index: gcc/testsuite/gcc.dg/pr43864-3.c
===================================================================
--- gcc/testsuite/gcc.dg/pr43864-3.c (revision 181377)
+++ gcc/testsuite/gcc.dg/pr43864-3.c (working copy)
@@ -20,4 +20,5 @@ int f(int c, int b, int d)
/* { dg-final { scan-tree-dump-times "if " 0 "pre"} } */
/* { dg-final { scan-tree-dump-times "_.*\\\+.*_" 1 "pre"} } */
+/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */
/* { dg-final { cleanup-tree-dump "pre" } } */
Index: gcc/testsuite/gcc.dg/pr43864-4.c
===================================================================
--- gcc/testsuite/gcc.dg/pr43864-4.c (revision 181377)
+++ gcc/testsuite/gcc.dg/pr43864-4.c (working copy)
@@ -25,4 +25,5 @@ int f(int c, int b, int d)
/* { dg-final { scan-tree-dump-times "if " 0 "pre"} } */
/* { dg-final { scan-tree-dump-times "_.*\\\+.*_" 1 "pre"} } */
/* { dg-final { scan-tree-dump-times " - " 2 "pre"} } */
+/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */
/* { dg-final { cleanup-tree-dump "pre" } } */
Index: gcc/testsuite/gcc.dg/pr43864.c
===================================================================
--- gcc/testsuite/gcc.dg/pr43864.c (revision 181377)
+++ gcc/testsuite/gcc.dg/pr43864.c (working copy)
@@ -32,4 +32,5 @@ hprofStartupp (char *outputFileName, cha
}
/* { dg-final { scan-tree-dump-times "myfree \\(" 1 "pre"} } */
+/* { dg-final { scan-tree-dump-not "Invalid sum" "pre"} } */
/* { dg-final { cleanup-tree-dump "pre" } } */