https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102557
Jan Hubicka <hubicka at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |hubicka at gcc dot gnu.org --- Comment #4 from Jan Hubicka <hubicka at gcc dot gnu.org> --- It is caused by broken early exit while updating the access range which makes insert_access to get into infinite recursion (trying to free space to add extra item) gcc/ChangeLog: PR ipa/102557 * ipa-modref-tree.h (modref_access_node::update): Fix early exit conditional. (modref_ref_node::insert_access): Sanity check that mergin suceeded. diff --git a/gcc/ipa-modref-tree.h b/gcc/ipa-modref-tree.h index 8e9b89b3e2c..52f225b1aae 100644 --- a/gcc/ipa-modref-tree.h +++ b/gcc/ipa-modref-tree.h @@ -148,7 +148,8 @@ struct GTY(()) modref_access_node poly_int64 offset1, poly_int64 size1, poly_int64 max_size1, bool record_adjustments) { - if (known_eq (offset, offset1) + if (known_eq (parm_offset, parm_offset1) + && known_eq (offset, offset1) && known_eq (size, size1) && known_eq (max_size, max_size1)) return; @@ -577,6 +578,10 @@ struct GTY((user)) modref_ref_node } (*accesses)[best1].forced_merge (best2 < 0 ? a : (*accesses)[best2], record_adjustments); + /* Check that merging indeed merged ranges. */ + gcc_checking_assert ((*accesses)[best1].contains (best2 < 0 ? a : (*accesses)[best2])); + /*if (best2 >= 0) + accesses->unordered_remove (best2);*/ if (!(*accesses)[best1].useful_p ()) { collapse ();