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 <tejohn...@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 | tejohn...@google.com | 408-460-2413