The strlen pass initializes its pointer_query member object with a cache consisting of a couple of vec's. Because vec doesn't implement RAII its memory must be explicitly released to avoid memory leaks. The attached patch adds a dtor to the strlen_dom_walker to do that.
Tested on x86_64-linux and by verifying that the cache leaks are gone by compiling gcc.dg/Wstringop-overflow*.c tests under Valgrind. I'll plan to commit this change as "obvious" tomorrow unless there are suggestions for changes. Martin PS Valgrind shows a fair number of leaks even with the patch but none of them due to the pointer_query cache.
PR tree-optimization/98937 - pointer_query cache leaks gcc/ChangeLog: PR tree-optimization/98937 * tree-ssa-strlen.c (strlen_dom_walker::~strlen_dom_walker): Define. Flush pointer_query cache. diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index c6f74051607..8912a113de9 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -5491,6 +5491,8 @@ public: m_cleanup_cfg (false) { } + ~strlen_dom_walker (); + virtual edge before_dom_children (basic_block); virtual void after_dom_children (basic_block); @@ -5508,6 +5510,13 @@ public: bool m_cleanup_cfg; }; +/* Release pointer_query cache. */ + +strlen_dom_walker::~strlen_dom_walker () +{ + ptr_qry.flush_cache (); +} + /* Callback for walk_dominator_tree. Attempt to optimize various string ops by remembering string lengths pointed by pointer SSA_NAMEs. */