]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix off-by-one error in try_merge_with
authorJan Hubicka <hubicka@ucw.cz>
Thu, 26 Aug 2021 13:33:56 +0000 (15:33 +0200)
committerJan Hubicka <hubicka@ucw.cz>
Thu, 26 Aug 2021 13:33:56 +0000 (15:33 +0200)
gcc/ChangeLog:

* ipa-modref-tree.h (modref_ref_node::verify): New member
functoin.
(modref_ref_node::insert): Use it.
(modref_ref_node::try_mere_with): Fix off by one error.

gcc/ipa-modref-tree.h

index 6f6932f08751085329845070eff901329c08d9b9..4edec4efded5cf6bd5e4988df1aa9f60823eca3a 100644 (file)
@@ -322,6 +322,20 @@ struct GTY((user)) modref_ref_node
     every_access = true;
   }
 
+  /* Verify that list does not contain redundant accesses.  */
+  void verify ()
+  {
+    size_t i, i2;
+    modref_access_node *a, *a2;
+
+    FOR_EACH_VEC_SAFE_ELT (accesses, i, a)
+      {
+       FOR_EACH_VEC_SAFE_ELT (accesses, i2, a2)
+         if (i != i2)
+           gcc_assert (!a->contains (*a2));
+      }
+  }
+
   /* Insert access with OFFSET and SIZE.
      Collapse tree if it has more than MAX_ACCESSES entries.
      If RECORD_ADJUSTMENTs is true avoid too many interval extensions.
@@ -337,6 +351,9 @@ struct GTY((user)) modref_ref_node
     size_t i;
     modref_access_node *a2;
 
+    if (flag_checking)
+      verify ();
+
     if (!a.useful_p ())
       {
        if (!every_access)
@@ -392,13 +409,15 @@ private:
     size_t i;
 
     FOR_EACH_VEC_SAFE_ELT (accesses, i, a2)
-      if (i != index)
-       if ((*accesses)[index].contains (*a2)
-           || (*accesses)[index].merge (*a2, false))
+      if (i != index
+         && ((*accesses)[index].contains (*a2)
+             || (*accesses)[index].merge (*a2, false)))
        {
-         if (index == accesses->length () - 1)
-           index = i;
          accesses->unordered_remove (i);
+         if (index == accesses->length ())
+           index = i;
+         else
+           i--;
        }
   }
 };