This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 7/7] [ARC] Fix errors in arc_ifcvt.
- From: Andrew Burgess <andrew dot burgess at embecosm dot com>
- To: Claudiu Zissulescu <Claudiu dot Zissulescu at synopsys dot com>
- Cc: gcc-patches at gcc dot gnu dot org, Francois dot Bedard at synopsys dot com, sandra at codesourcery dot com
- Date: Thu, 31 Aug 2017 19:59:51 +0100
- Subject: Re: [PATCH 7/7] [ARC] Fix errors in arc_ifcvt.
- Authentication-results: sourceware.org; auth=none
- References: <1500885779-12930-1-git-send-email-claziss@synopsys.com> <1500885779-12930-8-git-send-email-claziss@synopsys.com>
* Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2017-07-24 10:42:59 +0200]:
> From: claziss <claziss@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 <claziss@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
>