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