Message ID | CAAe5K+VVz76TiiZ5OBT8-121TB00Dq-r04Vx2J9Bkjkk7ejSuA@mail.gmail.com |
---|---|
State | New |
Headers | show |
> This patch fixes a profiledbootstrap failure that occurred after I > added some profile fixup. The initial profile insanity occurred > upstream of my change, but my change caused the insanity to spread to > the edge probability, resulting in a verify failure. The patch below > ensures this doesn't occur. > > Bootstrapped and tested on x86-64-unknown-linux-gnu. A > profiledbootstrap build also now succeeds. Ok for trunk? OK. Honza > > Thanks, > Teresa > > 2013-10-29 Teresa Johnson <tejohnson@google.com> > > PR ipa/58862 > * tree-ssa-tail-merge.c (replace_block_by): Tolerate profile > insanities when updating probabilities. > > Index: tree-ssa-tail-merge.c > =================================================================== > --- tree-ssa-tail-merge.c (revision 204166) > +++ tree-ssa-tail-merge.c (working copy) > @@ -1467,7 +1467,7 @@ static void > replace_block_by (basic_block bb1, basic_block bb2) > { > edge pred_edge; > - edge e1; > + edge e1, e2; > edge_iterator ei; > unsigned int i; > gimple bb2_phi; > @@ -1502,16 +1502,22 @@ replace_block_by (basic_block bb1, basic_block bb2 > bb2->count += bb1->count; > > /* Merge the outgoing edge counts from bb1 onto bb2. */ > + gcov_type out_sum = 0; > FOR_EACH_EDGE (e1, ei, bb1->succs) > { > - edge e2; > e2 = find_edge (bb2, e1->dest); > gcc_assert (e2); > e2->count += e1->count; > - /* Recompute the probability from the new merged edge count (bb2->count > - was updated above). */ > - e2->probability = GCOV_COMPUTE_SCALE (e2->count, bb2->count); > + out_sum += e2->count; > } > + /* Recompute the edge probabilities from the new merged edge count. > + Use the sum of the new merged edge counts computed above instead > + of bb2's merged count, in case there are profile count insanities > + making the bb count inconsistent with the edge weights. */ > + FOR_EACH_EDGE (e2, ei, bb2->succs) > + { > + e2->probability = GCOV_COMPUTE_SCALE (e2->count, out_sum); > + } > > /* Do updates that use bb1, before deleting bb1. */ > release_last_vdef (bb1); > > > -- > Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
Index: tree-ssa-tail-merge.c =================================================================== --- tree-ssa-tail-merge.c (revision 204166) +++ tree-ssa-tail-merge.c (working copy) @@ -1467,7 +1467,7 @@ static void replace_block_by (basic_block bb1, basic_block bb2) { edge pred_edge; - edge e1; + edge e1, e2; edge_iterator ei; unsigned int i; gimple bb2_phi; @@ -1502,16 +1502,22 @@ replace_block_by (basic_block bb1, basic_block bb2 bb2->count += bb1->count; /* Merge the outgoing edge counts from bb1 onto bb2. */ + gcov_type out_sum = 0; FOR_EACH_EDGE (e1, ei, bb1->succs) { - edge e2; e2 = find_edge (bb2, e1->dest); gcc_assert (e2); e2->count += e1->count; - /* Recompute the probability from the new merged edge count (bb2->count - was updated above). */ - e2->probability = GCOV_COMPUTE_SCALE (e2->count, bb2->count); + out_sum += e2->count; } + /* Recompute the edge probabilities from the new merged edge count. + Use the sum of the new merged edge counts computed above instead + of bb2's merged count, in case there are profile count insanities + making the bb count inconsistent with the edge weights. */ + FOR_EACH_EDGE (e2, ei, bb2->succs) + { + e2->probability = GCOV_COMPUTE_SCALE (e2->count, out_sum); + } /* Do updates that use bb1, before deleting bb1. */ release_last_vdef (bb1);