On Wed, Nov 13, 2019 at 01:15:18PM +0100, Ilya Leoshkevich wrote:
> > But OTOH it may well be the case that other things in cleanup_cfg make
> > the known dominance info invalid as well, in which case just the comment
> > is a bit misleading.  Sounds likely to me :-)
> 
> Yeah, that's what I worry about as well.  In particular, this block in
> try_optimize_cfg:

Heh, I did that code, whoops :-)

>             /* Try to change a conditional branch to a return to the
>                respective conditional return.  */
>             if (EDGE_COUNT (b->succs) == 2
>                 && any_condjump_p (BB_END (b))
>                 && bb_is_just_return (BRANCH_EDGE (b)->dest, &ret, &use))
>               {
>                 if (redirect_jump (as_a <rtx_jump_insn *> (BB_END (b)),
>                                    PATTERN (ret), 0))
>                   {
>                     if (use)
>                       emit_insn_before (copy_insn (PATTERN (use)),
>                                         BB_END (b));
>                     if (dump_file)
>                       fprintf (dump_file, "Changed conditional jump %d->%d "
>                                "to conditional return.\n",
>                                b->index, BRANCH_EDGE (b)->dest->index);
>                     redirect_edge_succ (BRANCH_EDGE (b),
>                                         EXIT_BLOCK_PTR_FOR_FN (cfun));
>                     BRANCH_EDGE (b)->flags &= ~EDGE_CROSSING;
>                     changed_here = true;
>                   }
>               }
> 
> runs regardless of cleanup mode, and it makes use of redirect_edge_succ,
> which does not update dominators.

Yeah.  Of course this only does anything if the targeted block is only
a return insn (and maybe a USE of the return value), so nothing bad will
happen, but the dom info is not technically correct anymore.


Segher

Reply via email to