On 10/30/2011 09:20 AM, Tom de Vries wrote: > Richard, > > I have a fix for PR50878.
Sorry, with patch this time. Thanks, - Tom > > A simplified form of the problem from the test-case of the PR is shown in this > cfg. Block 12 has as direct dominator block 5. > > 5 > / \ > / \ > * * > 6 7 > | | > | | > * * > 8 9 > \ / > \ / > * > 12 > > tail_merge_optimize finds that blocks 6 and 7 are duplicates. After replacing > block 7 by block 6, the cfg looks like this: > > 5 > | > | > * > 6 > / \ > / \ > * * > 8 9 > \ / > \ / > * > 12 > > The new direct dominator of block 12 is block 6, but the current algorithm > only > recalculates dominator info for blocks 6, 8 and 9. > > The patch fixes this by additionally recalculating the dominator info for > blocks > immediately dominated by bb2 (block 6 in the example), if bb2 has a single > predecessor after replacement. > > Bootstapped and reg-tested on x86_64 and i686. Build and reg-tested on MIPS > and ARM. > > Ok for trunk? > > Thanks, > - Tom > > 2011-10-30 Tom de Vries <t...@codesourcery.com> > > PR tree-optimization/50878 > * tree-ssa-tail-merge.c (replace_block_by): Recalculate dominator info > for blocks immediately dominated by bb2, if bb2 has a single predecessor > after replacement.
Index: gcc/tree-ssa-tail-merge.c =================================================================== --- gcc/tree-ssa-tail-merge.c (revision 180562) +++ gcc/tree-ssa-tail-merge.c (working copy) @@ -1604,7 +1604,10 @@ replace_block_by (basic_block bb1, basic same_succ_flush_bb (bb1); delete_basic_block (bb1); - fix_dom_bb = VEC_alloc (basic_block, heap, 2); + if (single_pred_p (bb2)) + fix_dom_bb = get_dominated_by (CDI_DOMINATORS, single_pred (bb2)); + else + fix_dom_bb = VEC_alloc (basic_block, heap, 2); VEC_safe_push (basic_block, heap, fix_dom_bb, bb2); FOR_EACH_EDGE (e, ei, bb2->succs) VEC_safe_push (basic_block, heap, fix_dom_bb, e->dest);