From f2cc526f47acbeeddd77b706a212b4703562e57f Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 15 Jan 2021 16:45:41 +0000 Subject: recog: Fix insn_change_watermark destructor Noticed while working on something else that the insn_change_watermark destructor could call cancel_changes for changes that no longer exist. The loop in cancel_changes is a nop in that case, but: num_changes = num; can mess things up. I think this would only affect nested uses of insn_change_watermark. gcc/ * recog.h (insn_change_watermark::~insn_change_watermark): Avoid calling cancel_changes for changes that no longer exist. --- gcc/recog.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gcc/recog.h b/gcc/recog.h index 269094a..e96e66e 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -547,13 +547,19 @@ class insn_change_watermark { public: insn_change_watermark () : m_old_num_changes (num_validated_changes ()) {} - ~insn_change_watermark () { cancel_changes (m_old_num_changes); } + ~insn_change_watermark (); void keep () { m_old_num_changes = num_validated_changes (); } private: int m_old_num_changes; }; +inline insn_change_watermark::~insn_change_watermark () +{ + if (m_old_num_changes < num_validated_changes ()) + cancel_changes (m_old_num_changes); +} + #endif #endif /* GCC_RECOG_H */ -- cgit v1.1