This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 1/9] [SFN] adjust RTL insn-walking API
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Alexandre Oliva <aoliva at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 9 Oct 2017 15:12:37 +0200
- Subject: Re: [PATCH 1/9] [SFN] adjust RTL insn-walking API
- Authentication-results: sourceware.org; auth=none
- References: <orefqoy2u9.fsf@lxoliva.fsfla.org> <20170930090827.6604-1-aoliva@redhat.com>
On Sat, Sep 30, 2017 at 11:08 AM, Alexandre Oliva <aoliva@redhat.com> wrote:
> This patch removes unused RTL functions, introduces alternate ones for
> use in a later SFN patch, and regroups other related functions so that
> they appear in a more consistent order.
Ok.
Thanks,
Richard.
> for gcc/ChangeLog
>
> * emit-rtl.c (next_nondebug_insn, prev_nondebug_insn): Reorder.
> (next_nonnote_nondebug_insn, prev_nonnote_nondebug_insn): Reorder.
> (next_nonnote_nondebug_insn_bb): New.
> (prev_nonnote_nondebug_insn_bb): New.
> (prev_nonnote_insn_bb, next_nonnote_insn_bb): Remove.
> * rtl.h (prev_nonnote_insn_bb, next_nonnote_insn_bb): Remove decls.
> (prev_nonnote_nondebug_insn_bb): Declare.
> (next_nonnote_nondebug_insn_bb): Declare.
> * cfgbuild.c (find_bb_boundaries): Adjust to skip debug insns.
> * cfgrtl.c (get_last_bb_insn): Likewise.
> * lra.c (push_insns): Likewise.
> ---
> gcc/cfgbuild.c | 2 +-
> gcc/cfgrtl.c | 4 ++--
> gcc/emit-rtl.c | 69 ++++++++++++++++++++++++++++++++--------------------------
> gcc/lra.c | 2 +-
> gcc/rtl.h | 4 ++--
> 5 files changed, 44 insertions(+), 37 deletions(-)
>
> diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c
> index 62956b2..76c21d7 100644
> --- a/gcc/cfgbuild.c
> +++ b/gcc/cfgbuild.c
> @@ -512,7 +512,7 @@ find_bb_boundaries (basic_block bb)
> the middle of a BB. We need to split it in the same manner as
> if the barrier were preceded by a control_flow_insn_p insn. */
> if (!flow_transfer_insn)
> - flow_transfer_insn = prev_nonnote_insn_bb (insn);
> + flow_transfer_insn = prev_nonnote_nondebug_insn_bb (insn);
> }
>
> if (control_flow_insn_p (insn))
> diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
> index 6ef47b7..bce56b4 100644
> --- a/gcc/cfgrtl.c
> +++ b/gcc/cfgrtl.c
> @@ -2274,11 +2274,11 @@ get_last_bb_insn (basic_block bb)
> end = table;
>
> /* Include any barriers that may follow the basic block. */
> - tmp = next_nonnote_insn_bb (end);
> + tmp = next_nonnote_nondebug_insn_bb (end);
> while (tmp && BARRIER_P (tmp))
> {
> end = tmp;
> - tmp = next_nonnote_insn_bb (end);
> + tmp = next_nonnote_nondebug_insn_bb (end);
> }
>
> return end;
> diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
> index e790cbc..68c1f11 100644
> --- a/gcc/emit-rtl.c
> +++ b/gcc/emit-rtl.c
> @@ -3355,20 +3355,17 @@ next_nonnote_insn (rtx_insn *insn)
> return insn;
> }
>
> -/* Return the next insn after INSN that is not a NOTE, but stop the
> - search before we enter another basic block. This routine does not
> - look inside SEQUENCEs. */
> +/* Return the next insn after INSN that is not a DEBUG_INSN. This
> + routine does not look inside SEQUENCEs. */
>
> rtx_insn *
> -next_nonnote_insn_bb (rtx_insn *insn)
> +next_nondebug_insn (rtx_insn *insn)
> {
> while (insn)
> {
> insn = NEXT_INSN (insn);
> - if (insn == 0 || !NOTE_P (insn))
> + if (insn == 0 || !DEBUG_INSN_P (insn))
> break;
> - if (NOTE_INSN_BASIC_BLOCK_P (insn))
> - return NULL;
> }
>
> return insn;
> @@ -3390,67 +3387,70 @@ prev_nonnote_insn (rtx_insn *insn)
> return insn;
> }
>
> -/* Return the previous insn before INSN that is not a NOTE, but stop
> - the search before we enter another basic block. This routine does
> - not look inside SEQUENCEs. */
> +/* Return the previous insn before INSN that is not a DEBUG_INSN.
> + This routine does not look inside SEQUENCEs. */
>
> rtx_insn *
> -prev_nonnote_insn_bb (rtx_insn *insn)
> +prev_nondebug_insn (rtx_insn *insn)
> {
> -
> while (insn)
> {
> insn = PREV_INSN (insn);
> - if (insn == 0 || !NOTE_P (insn))
> + if (insn == 0 || !DEBUG_INSN_P (insn))
> break;
> - if (NOTE_INSN_BASIC_BLOCK_P (insn))
> - return NULL;
> }
>
> return insn;
> }
>
> -/* Return the next insn after INSN that is not a DEBUG_INSN. This
> - routine does not look inside SEQUENCEs. */
> +/* Return the next insn after INSN that is not a NOTE nor DEBUG_INSN.
> + This routine does not look inside SEQUENCEs. */
>
> rtx_insn *
> -next_nondebug_insn (rtx_insn *insn)
> +next_nonnote_nondebug_insn (rtx_insn *insn)
> {
> while (insn)
> {
> insn = NEXT_INSN (insn);
> - if (insn == 0 || !DEBUG_INSN_P (insn))
> + if (insn == 0 || (!NOTE_P (insn) && !DEBUG_INSN_P (insn)))
> break;
> }
>
> return insn;
> }
>
> -/* Return the previous insn before INSN that is not a DEBUG_INSN.
> - This routine does not look inside SEQUENCEs. */
> +/* Return the next insn after INSN that is not a NOTE nor DEBUG_INSN,
> + but stop the search before we enter another basic block. This
> + routine does not look inside SEQUENCEs. */
>
> rtx_insn *
> -prev_nondebug_insn (rtx_insn *insn)
> +next_nonnote_nondebug_insn_bb (rtx_insn *insn)
> {
> while (insn)
> {
> - insn = PREV_INSN (insn);
> - if (insn == 0 || !DEBUG_INSN_P (insn))
> + insn = NEXT_INSN (insn);
> + if (insn == 0)
> + break;
> + if (DEBUG_INSN_P (insn))
> + continue;
> + if (!NOTE_P (insn))
> break;
> + if (NOTE_INSN_BASIC_BLOCK_P (insn))
> + return NULL;
> }
>
> return insn;
> }
>
> -/* Return the next insn after INSN that is not a NOTE nor DEBUG_INSN.
> +/* Return the previous insn before INSN that is not a NOTE nor DEBUG_INSN.
> This routine does not look inside SEQUENCEs. */
>
> rtx_insn *
> -next_nonnote_nondebug_insn (rtx_insn *insn)
> +prev_nonnote_nondebug_insn (rtx_insn *insn)
> {
> while (insn)
> {
> - insn = NEXT_INSN (insn);
> + insn = PREV_INSN (insn);
> if (insn == 0 || (!NOTE_P (insn) && !DEBUG_INSN_P (insn)))
> break;
> }
> @@ -3458,17 +3458,24 @@ next_nonnote_nondebug_insn (rtx_insn *insn)
> return insn;
> }
>
> -/* Return the previous insn before INSN that is not a NOTE nor DEBUG_INSN.
> - This routine does not look inside SEQUENCEs. */
> +/* Return the previous insn before INSN that is not a NOTE nor
> + DEBUG_INSN, but stop the search before we enter another basic
> + block. This routine does not look inside SEQUENCEs. */
>
> rtx_insn *
> -prev_nonnote_nondebug_insn (rtx_insn *insn)
> +prev_nonnote_nondebug_insn_bb (rtx_insn *insn)
> {
> while (insn)
> {
> insn = PREV_INSN (insn);
> - if (insn == 0 || (!NOTE_P (insn) && !DEBUG_INSN_P (insn)))
> + if (insn == 0)
> break;
> + if (DEBUG_INSN_P (insn))
> + continue;
> + if (!NOTE_P (insn))
> + break;
> + if (NOTE_INSN_BASIC_BLOCK_P (insn))
> + return NULL;
> }
>
> return insn;
> diff --git a/gcc/lra.c b/gcc/lra.c
> index a473777..9037495 100644
> --- a/gcc/lra.c
> +++ b/gcc/lra.c
> @@ -1810,7 +1810,7 @@ push_insns (rtx_insn *from, rtx_insn *to)
> static void
> setup_sp_offset (rtx_insn *from, rtx_insn *last)
> {
> - rtx_insn *before = next_nonnote_insn_bb (last);
> + rtx_insn *before = next_nonnote_nondebug_insn_bb (last);
> HOST_WIDE_INT offset = (before == NULL_RTX || ! INSN_P (before)
> ? 0 : lra_get_insn_recog_data (before)->sp_offset);
>
> diff --git a/gcc/rtl.h b/gcc/rtl.h
> index a63f33e..3bda77c 100644
> --- a/gcc/rtl.h
> +++ b/gcc/rtl.h
> @@ -2980,13 +2980,13 @@ extern rtx_call_insn *last_call_insn (void);
> extern rtx_insn *previous_insn (rtx_insn *);
> extern rtx_insn *next_insn (rtx_insn *);
> extern rtx_insn *prev_nonnote_insn (rtx_insn *);
> -extern rtx_insn *prev_nonnote_insn_bb (rtx_insn *);
> extern rtx_insn *next_nonnote_insn (rtx_insn *);
> -extern rtx_insn *next_nonnote_insn_bb (rtx_insn *);
> extern rtx_insn *prev_nondebug_insn (rtx_insn *);
> extern rtx_insn *next_nondebug_insn (rtx_insn *);
> extern rtx_insn *prev_nonnote_nondebug_insn (rtx_insn *);
> +extern rtx_insn *prev_nonnote_nondebug_insn_bb (rtx_insn *);
> extern rtx_insn *next_nonnote_nondebug_insn (rtx_insn *);
> +extern rtx_insn *next_nonnote_nondebug_insn_bb (rtx_insn *);
> extern rtx_insn *prev_real_insn (rtx_insn *);
> extern rtx_insn *next_real_insn (rtx);
> extern rtx_insn *prev_active_insn (rtx_insn *);
> --
> 2.9.5
>