> On Tue, Nov 12, 2019 at 04:32:36PM +0100, Ilya Leoshkevich wrote:
>>> Am 12.11.2019 um 15:32 schrieb Segher Boessenkool 
>>> <seg...@kernel.crashing.org>:
>>> On Tue, Nov 12, 2019 at 03:11:05PM +0100, Ilya Leoshkevich wrote:
>>>> unsigned int
>>>> pass_jump_after_combine::execute (function *)
>>>> {
>>>> +  /* Jump threading does not keep dominators up-to-date.  */
>>>> +  free_dominance_info (CDI_DOMINATORS);
>>>> +  free_dominance_info (CDI_POST_DOMINATORS);
>>>>  cleanup_cfg (flag_thread_jumps ? CLEANUP_THREADING : 0);
>>>>  return 0;
>>>> }
>>> 
>>> Why do you always free it, if if only gets invalidated if flag_thread_jumps?
>>> 
>>> It may be a good idea to throw away the dom info anyway, but the comment
>>> seems off then?
>> 
>> Hmm, come to think of it, it would make sense to make flag_thread_jumps
>> a gate for this pass, and then run free_dominance_info (CDI_DOMINATORS)
>> and cleanup_cfg (CLEANUP_THREADING) unconditionally. What do you think?
> 
> But we want  cleanup_cfg (0)  if the flag is not set, no?  Maybe
> something like

When I was adding this pass, I didn't really want cleanup_cfg (0) - I
don't think this achieves anything useful at this point.  It's just that
I copied the structure of the existing code without thinking too much
about it.  But now that you brought it up...

> 
> unsigned int
> pass_jump_after_combine::execute (function *)
> {
>  if (flag_thread_jumps)
>    {
>      /* Jump threading does not keep dominators up-to-date.  */
>      free_dominance_info (CDI_DOMINATORS);
>      cleanup_cfg (CLEANUP_THREADING);
>    }
>  else
>    cleanup_cfg (0);
> 
>  return 0;
> }
> 
> 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:

              /* 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.

Best regards,
Ilya

Reply via email to