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 <t...@codesourcery.com> * 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" } } */