Alex Coplan <[email protected]> writes:
> In the case that !insn->is_debug_insn () && next->is_debug_insn (), this
> function was missing an update of the prev pointer on the first nondebug
> insn following the sequence of debug insns starting at next.
>
> This can lead to corruption of the insn chain, in that we end up with:
>
> insn->next_any_insn ()->prev_any_insn () != insn
>
> in this case. This patch fixes that.
>
> Bootstrapped/regtested as a series on aarch64-linux-gnu, OK for trunk?
>
> gcc/ChangeLog:
>
> * rtl-ssa/insns.cc (function_info::add_insn_after): Ensure we
> update the prev pointer on the following nondebug insn in the
> case that !insn->is_debug_insn () && next->is_debug_insn ().
OK, thanks.
Richard
> ---
> gcc/rtl-ssa/insns.cc | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/rtl-ssa/insns.cc b/gcc/rtl-ssa/insns.cc
> index a0c2fec2b70..f970375d906 100644
> --- a/gcc/rtl-ssa/insns.cc
> +++ b/gcc/rtl-ssa/insns.cc
> @@ -291,9 +291,17 @@ function_info::add_insn_after (insn_info *insn,
> insn_info *after)
> first->set_last_debug_insn (insn);
> }
> else // !insn->is_debug_insn () && next->is_debug_insn ()
> - // At present we don't (need to) support inserting a nondebug
> - // instruction between two existing debug instructions.
> - gcc_assert (!after->is_debug_insn ());
> + {
> + // At present we don't (need to) support inserting a nondebug
> + // instruction between two existing debug instructions.
> + gcc_assert (!after->is_debug_insn ());
> +
> + // Find the next nondebug insn and update its previous pointer
> + // to point to INSN.
> + auto next_nondebug = next->last_debug_insn ()->next_any_insn ();
> + gcc_checking_assert (!next_nondebug->is_debug_insn ());
> + next_nondebug->set_prev_sametype_insn (insn);
> + }
>
> // If AFTER and NEXT are separated by at least two points, we can
> // use a unique point number for INSN. Otherwise INSN will have