@@ -1444,6 +1444,9 @@ auto SchemaFrame::populate_reachability(const Location &base,
14441444 WeakPointer::Hasher, WeakPointer::Comparator>
14451445 has_non_pointer_location;
14461446
1447+ this ->pointer_to_location_ .reserve (this ->locations_ .size ());
1448+ has_non_pointer_location.reserve (this ->locations_ .size ());
1449+ pointers_with_non_orphan.reserve (this ->locations_ .size ());
14471450 for (const auto &entry : this ->locations_ ) {
14481451 auto [iterator, inserted] = this ->pointer_to_location_ .try_emplace (
14491452 std::cref (entry.second .pointer ), std::vector<const Location *>{});
@@ -1715,6 +1718,7 @@ auto SchemaFrame::populate_reachability(const Location &base,
17151718 bool changed{true };
17161719 while (changed) {
17171720 changed = false ;
1721+ std::vector<std::reference_wrapper<const WeakPointer>> newly_reachable;
17181722
17191723 auto write_iterator = unreachable_with_sources.begin ();
17201724 for (auto read_iterator = unreachable_with_sources.begin ();
@@ -1739,15 +1743,8 @@ auto SchemaFrame::populate_reachability(const Location &base,
17391743 }
17401744
17411745 if (became_reachable) {
1742- const auto &reached_pointer{read_iterator->pointer .get ()};
17431746 cache[read_iterator->pointer ] = true ;
1744- for (auto &[cache_pointer, cache_reachable] : cache) {
1745- if (!cache_reachable &&
1746- cache_pointer.get ().starts_with (reached_pointer) &&
1747- pointers_with_non_orphan.contains (cache_pointer)) {
1748- cache_reachable = true ;
1749- }
1750- }
1747+ newly_reachable.push_back (read_iterator->pointer );
17511748 changed = true ;
17521749 } else {
17531750 if (write_iterator != read_iterator) {
@@ -1758,6 +1755,21 @@ auto SchemaFrame::populate_reachability(const Location &base,
17581755 }
17591756 unreachable_with_sources.erase (write_iterator,
17601757 unreachable_with_sources.end ());
1758+
1759+ for (auto &[cache_pointer, cache_reachable] : cache) {
1760+ if (cache_reachable) {
1761+ continue ;
1762+ }
1763+ if (!pointers_with_non_orphan.contains (cache_pointer)) {
1764+ continue ;
1765+ }
1766+ for (const auto &reached : newly_reachable) {
1767+ if (cache_pointer.get ().starts_with (reached.get ())) {
1768+ cache_reachable = true ;
1769+ break ;
1770+ }
1771+ }
1772+ }
17611773 }
17621774
17631775 return cache;
0 commit comments