* Claudiu Zissulescu <claudiu.zissule...@synopsys.com> [2017-07-24 10:42:59 
+0200]:

> From: claziss <claz...@synopsys.com>
> 
> The arc_ifcvt procedure is removing a label even when it is used by
> another jump.  This patch fixes dg.exp/pr31507-1.c.
> 
> gcc/
> 2017-07-10  Claudiu Zissulescu  <claz...@synopsys.com>
> 
>       * config/arc/arc.c (arc_ifcvt): Remove use of merge_blocks call.
>       (arc_ccfsm_advance): Fix checking for delay slots.
>       (arc_reorg): Add rtl dump after each call to arc_ifcvt

Looks good.

Thanks,
Andrew




> ---
>  gcc/config/arc/arc.c | 42 +++++++++++-------------------------------
>  1 file changed, 11 insertions(+), 31 deletions(-)
> 
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index 0f9b553..f7a2b61 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -4429,12 +4429,10 @@ arc_ccfsm_advance (rtx_insn *insn, struct arc_ccfsm 
> *state)
>  
>        /* If this is a non-annulled branch with a delay slot, there is
>        no need to conditionalize the delay slot.  */
> -      if (NEXT_INSN (PREV_INSN (insn)) != insn
> +      if ((GET_CODE (PATTERN (NEXT_INSN (PREV_INSN (insn)))) == SEQUENCE)
>         && state->state == 0 && !INSN_ANNULLED_BRANCH_P (insn))
>       {
>         this_insn = NEXT_INSN (this_insn);
> -       gcc_assert (NEXT_INSN (NEXT_INSN (PREV_INSN (start_insn)))
> -                   == NEXT_INSN (this_insn));
>       }
>        /* See how many insns this branch skips, and what kind of insns.  If 
> all
>        insns are okay, and the label or unconditional branch to the same
> @@ -7547,6 +7545,12 @@ arc_reorg (void)
>         arc_ifcvt ();
>         unsigned int flags = pass_data_arc_ifcvt.todo_flags_finish;
>         df_finish_pass ((flags & TODO_df_verify) != 0);
> +
> +       if (dump_file)
> +         {
> +           fprintf (dump_file, ";; After if conversion:\n\n");
> +           print_rtl (dump_file, get_insns ());
> +         }
>       }
>  
>        /* Call shorten_branches to calculate the insn lengths.  */
> @@ -8998,7 +9002,6 @@ static unsigned
>  arc_ifcvt (void)
>  {
>    struct arc_ccfsm *statep = &cfun->machine->ccfsm_current;
> -  basic_block merge_bb = 0;
>  
>    memset (statep, 0, sizeof *statep);
>    for (rtx_insn *insn = get_insns (); insn; insn = next_insn (insn))
> @@ -9008,20 +9011,14 @@ arc_ifcvt (void)
>        switch (statep->state)
>       {
>       case 0:
> -       if (JUMP_P (insn))
> -         merge_bb = 0;
>         break;
>       case 1: case 2:
>         {
>           /* Deleted branch.  */
> -         gcc_assert (!merge_bb);
> -         merge_bb = BLOCK_FOR_INSN (insn);
> -         basic_block succ_bb
> -           = BLOCK_FOR_INSN (NEXT_INSN (NEXT_INSN (PREV_INSN (insn))));
>           arc_ccfsm_post_advance (insn, statep);
>           gcc_assert (!IN_RANGE (statep->state, 1, 2));
>           rtx_insn *seq = NEXT_INSN (PREV_INSN (insn));
> -         if (seq != insn)
> +         if (GET_CODE (PATTERN (seq)) == SEQUENCE)
>             {
>               rtx slot = XVECEXP (PATTERN (seq), 0, 1);
>               rtx pat = PATTERN (slot);
> @@ -9035,18 +9032,10 @@ arc_ifcvt (void)
>                 gcc_unreachable ();
>               PUT_CODE (slot, NOTE);
>               NOTE_KIND (slot) = NOTE_INSN_DELETED;
> -             if (merge_bb && succ_bb)
> -               merge_blocks (merge_bb, succ_bb);
> -           }
> -         else if (merge_bb && succ_bb)
> -           {
> -             set_insn_deleted (insn);
> -             merge_blocks (merge_bb, succ_bb);
>             }
>           else
>             {
> -             PUT_CODE (insn, NOTE);
> -             NOTE_KIND (insn) = NOTE_INSN_DELETED;
> +             set_insn_deleted (insn);
>             }
>           continue;
>         }
> @@ -9055,17 +9044,8 @@ arc_ifcvt (void)
>             && statep->target_label == CODE_LABEL_NUMBER (insn))
>           {
>             arc_ccfsm_post_advance (insn, statep);
> -           basic_block succ_bb = BLOCK_FOR_INSN (insn);
> -           if (merge_bb && succ_bb)
> -             merge_blocks (merge_bb, succ_bb);
> -           else if (--LABEL_NUSES (insn) == 0)
> -             {
> -               const char *name = LABEL_NAME (insn);
> -               PUT_CODE (insn, NOTE);
> -               NOTE_KIND (insn) = NOTE_INSN_DELETED_LABEL;
> -               NOTE_DELETED_LABEL_NAME (insn) = name;
> -             }
> -           merge_bb = 0;
> +           if (--LABEL_NUSES (insn) == 0)
> +             delete_insn (insn);
>             continue;
>           }
>         /* Fall through.  */
> -- 
> 1.9.1
> 

Reply via email to