Kewen.Lin <li...@linux.ibm.com> writes:
> Hi Richard,
>
> on 2019/7/11 上午3:30, Richard Sandiford wrote:
>> "Kewen.Lin" <li...@linux.ibm.com> writes:
>>> Hi all,
>>> Is it a reasonable patch? If yes, is it ok for trunk?
>> 
>> It looks really useful, but IMO we should either emit the hint for all
>> end-of-block insns with a surprising fallthrough edge, or -- if we
>> really do want to keep it specific to conditional jumps -- we should
>> replace rhs "pc" in the jump insn with something like "bb <N>".
>> Personally the former seems better to me (and should also be simpler).
>> 
>
> Thanks a lot for the comments.  It's a good idea not only to check conditional
> jump insn.  I've updated the patch accordingly.  I was intended to change the
> pc dumping by using the actual BB label similar to what we see for non 
> fallthrough edge.  But as you mentioned it's not simple, need to pass some
> information down, it looks like a hint is enough for this case.  :)
>
>>> +  basic_block dest = e->dest;
>>> +  if (BB_HEAD (dest) != ninsn)
>>> +    fprintf (outf, ";;  pc falls through to BB %d\n", dest->index);
>> 
>> Very minor, but I think the output would be more readable if the comment
>> were indented by the same amount as the register notes (like REG_DEAD above).
>> In lisp tradition I guess the comment marker would then be ";" rather
>> than ";;".
>> 
>
> Good idea, also updated it accordingly, thanks!  With the attached patch, the
> dumping is as below:
>
>    12: r135:CC=cmp(r122:DI,0)
>    13: pc={(r135:CC!=0)?L52:pc}
>       REG_DEAD r135:CC
>       REG_BR_PROB 1041558836
>       ; pc falls through to BB 10
>    31: L31:
>    17: NOTE_INSN_BASIC_BLOCK 3
>
>
> Thanks,
> Kewen
>
>
> --------------
>
> gcc/ChangeLog
>
> 2019-07-11  Kewen Lin  <li...@gcc.gnu.org>
>
>       * gcc/cfgrtl.c (print_rtl_with_bb): Emit a hint if the fallthrough
>       target of current basic block isn't the placed right next.
>       
>
> diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
> index a1ca5992c41..5f2accf1f4f 100644
> --- a/gcc/cfgrtl.c
> +++ b/gcc/cfgrtl.c
> @@ -2193,14 +2193,14 @@ print_rtl_with_bb (FILE *outf, const rtx_insn 
> *rtx_first, dump_flags_t flags)
>        if (df)
>         df_dump_start (outf);
>
> -      if (flags & TDF_BLOCKS)

I think we still need an if here, but with the condition instead being:

   cfun->curr_properties & PROP_cfg

> +      FOR_EACH_BB_REVERSE_FN (bb, cfun)
>         {
> -         FOR_EACH_BB_REVERSE_FN (bb, cfun)
> -           {
> -             rtx_insn *x;
> +         rtx_insn *x;
>
> -             start[INSN_UID (BB_HEAD (bb))] = bb;
> -             end[INSN_UID (BB_END (bb))] = bb;
> +         start[INSN_UID (BB_HEAD (bb))] = bb;
> +         end[INSN_UID (BB_END (bb))] = bb;
> +         if (flags & TDF_BLOCKS)
> +           {
>               for (x = BB_HEAD (bb); x != NULL_RTX; x = NEXT_INSN (x))
>                 {
>                   enum bb_state state = IN_MULTIPLE_BB;
> @@ -2244,16 +2244,31 @@ print_rtl_with_bb (FILE *outf, const rtx_insn 
> *rtx_first, dump_flags_t flags)
>           if (flags & TDF_DETAILS)
>             df_dump_insn_bottom (tmp_rtx, outf);
>
> -         if (flags & TDF_BLOCKS)
> +         bb = end[INSN_UID (tmp_rtx)];
> +         if (bb != NULL)
>             {
> -             bb = end[INSN_UID (tmp_rtx)];
> -             if (bb != NULL)
> +             if (flags & TDF_BLOCKS)
>                 {
>                   dump_bb_info (outf, bb, 0, dump_flags, false, true);
>                   if (df && (flags & TDF_DETAILS))
>                     df_dump_bottom (bb, outf);
>                   putc ('\n', outf);
>                 }
> +             /* Emit a hint if the fallthrough target of current basic block
> +                isn't the one placed right next.  */
> +             else if (EDGE_COUNT (bb->succs) > 0)
> +               {
> +                 gcc_assert (BB_END (bb) == tmp_rtx);
> +                 const rtx_insn *ninsn = NEXT_INSN (tmp_rtx);

I think it'd be better to loop until we hit a real insn or a nonnull
start[], e.g. to cope with intervening deleted-insn notes and debug insns.
Something like:

                    while (ninsn && !INSN_P (nisn) && !start[INSN_UID (ninsn)])
                      ninsn = NEXT_INSN (insn);

Looks good otherwise, thanks.

Richard

> +                 edge e = find_fallthru_edge (bb->succs);
> +                 if (e && ninsn)
> +                   {
> +                     basic_block dest = e->dest;
> +                     if (start[INSN_UID (ninsn)] != dest)
> +                       fprintf (outf, "%s      ; pc falls through to BB 
> %d\n",
> +                                print_rtx_head, dest->index);
> +                   }
> +               }
>             }
>         }

Reply via email to