[gcc r17-3136] gccrs: forever-stack: Add dfs_cache

Arthur Cohen via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:ec3dca4aa08c1d2100fa241db01368fc5dbcef1e

commit r17-3136-gec3dca4aa08c1d2100fa241db01368fc5dbcef1e
Author: Arthur Cohen <[email protected]>
Date:   Tue Jun 23 15:41:10 2026 +0200

    gccrs: forever-stack: Add dfs_cache
    
    We do a *lot* of depth-first-search during name resolution, so having a
    temporary cache for the results speeds up the compilation of core by quite
    a lot. This is just a simple version that can be improved.
    
    On my machine, this shaves off almost 3 minutes from compiling core.
    
    gcc/rust/ChangeLog:
    
            * resolve/rust-forever-stack.h: Declare new cache API.
            * resolve/rust-forever-stack.hxx: Implement it and use it within
            dfs_cache.

Diff:
---
 gcc/rust/resolve/rust-forever-stack.h   |  4 ++++
 gcc/rust/resolve/rust-forever-stack.hxx | 28 +++++++++++++++++++++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/resolve/rust-forever-stack.h b/gcc/rust/resolve/rust-forever-stack.h
index 0f95d0d73233..eb21331166cb 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -796,6 +796,10 @@ public:
   tl::optional<const Node &> dfs_node (const Node &starting_point,
 				       NodeId to_find) const;
 
+  std::unordered_map<NodeId, Node &> dfs_cache;
+  tl::optional<Node &> check_cache (NodeId to_find);
+  void cache (NodeId found, Node &result);
+
   bool forward_declared (NodeId definition, NodeId usage)
   {
     if (peek ().kind != Rib::Kind::ForwardTypeParamBan)
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx b/gcc/rust/resolve/rust-forever-stack.hxx
index e901ddbca1c2..d7b121a6dd29 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -610,8 +610,15 @@ tl::optional<typename ForeverStack<N>::Node &>
 ForeverStack<N>::dfs_node (ForeverStack<N>::Node &starting_point,
 			   NodeId to_find)
 {
+  if (auto found = check_cache (to_find))
+    return found;
+
   if (starting_point.id == to_find)
-    return starting_point;
+    {
+      cache (to_find, starting_point);
+
+      return starting_point;
+    }
 
   for (auto &child : starting_point.children)
     {
@@ -643,6 +650,25 @@ ForeverStack<N>::dfs_node (const ForeverStack<N>::Node &starting_point,
   return tl::nullopt;
 }
 
+template <Namespace N>
+tl::optional<typename ForeverStack<N>::Node &>
+ForeverStack<N>::check_cache (NodeId to_find)
+{
+  auto entry = dfs_cache.find (to_find);
+
+  if (entry != dfs_cache.end ())
+    return entry->second;
+
+  return tl::nullopt;
+}
+
+template <Namespace N>
+void
+ForeverStack<N>::cache (NodeId found, typename ForeverStack<N>::Node &result)
+{
+  dfs_cache.insert ({found, result});
+}
+
 template <Namespace N>
 tl::optional<Rib &>
 ForeverStack<N>::to_rib (NodeId rib_id)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.