This patch updates the merged bb count only when they are in the same loop.
Bootstrapped and passed regression test. Ok for trunk? Thanks, Dehao gcc/ChangeLog: 2014-05-30 Dehao Chen <de...@google.com> * tree-cfg.c (gimple_merge_blocks): Only reset count when BBs are in the same loop. gcc/testsuite/ChangeLog: 2014-05-30 Dehao Chen <de...@google.com> * gcc.dg/tree-prof/merge_block.c: New test. Index: gcc/testsuite/gcc.dg/tree-prof/merge_block.c =================================================================== --- gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-prof/merge_block.c (revision 0) @@ -0,0 +1,20 @@ + +/* { dg-options "-O2 -fno-ipa-pure-const -fdump-tree-optimized-blocks-details -fno-early-inlining" } */ +int a[8]; +int t() +{ + int i; + for (i = 0; i < 3; i++) + if (a[i]) + break; + return i; +} +main () +{ + int i; + for (i = 0; i < 1000; i++) + t (); + return 0; +} +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ Index: gcc/tree-cfg.c =================================================================== --- gcc/tree-cfg.c (revision 211096) +++ gcc/tree-cfg.c (working copy) @@ -1880,8 +1880,11 @@ gimple_merge_blocks (basic_block a, basic_block b) /* When merging two BBs, if their counts are different, the larger count is selected as the new bb count. This is to handle inconsistent profiles. */ - a->count = MAX (a->count, b->count); - a->frequency = MAX (a->frequency, b->frequency); + if (a->loop_father == b->loop_father) + { + a->count = MAX (a->count, b->count); + a->frequency = MAX (a->frequency, b->frequency); + } /* Merge the sequences. */ last = gsi_last_bb (a);