aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Coplan <alex.coplan@arm.com>2023-10-13 17:13:16 +0100
committerAlex Coplan <alex.coplan@arm.com>2023-10-19 11:12:22 +0100
commitc338083377021d27ce625fcd312c316e20e1792c (patch)
tree4f3d4e727f0ae88ce0ecba3085b66c2a06448224
parentfaa0e82b409362ba022f6872cea9677e9dd42f0c (diff)
downloadgcc-c338083377021d27ce625fcd312c316e20e1792c.zip
gcc-c338083377021d27ce625fcd312c316e20e1792c.tar.gz
gcc-c338083377021d27ce625fcd312c316e20e1792c.tar.bz2
rtl-ssa: Fix bug in function_info::add_insn_after
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. 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 ().
-rw-r--r--gcc/rtl-ssa/insns.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/gcc/rtl-ssa/insns.cc b/gcc/rtl-ssa/insns.cc
index a0c2fec..f970375 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