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 ();

Reply via email to