https://gcc.gnu.org/g:04065d8c3083f76f877dc62d56807a7d3638be69

commit r15-3252-g04065d8c3083f76f877dc62d56807a7d3638be69
Author: Richard Biener <rguent...@suse.de>
Date:   Wed Aug 28 11:04:07 2024 +0200

    Fix leak of SLP nodes when building store interleaving
    
    The following fixes a leak of the discovered single-lane store
    SLP nodes from which we only use their children.  This uncovers
    a latent reference counting issue in the interleaving build where
    we fail to increment their reference count.
    
            * tree-vect-slp.cc (vect_build_slp_store_interleaving):
            Fix reference counting.
            (vect_build_slp_instance): Release rhs_nodes.

Diff:
---
 gcc/tree-vect-slp.cc | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 79d83efb0159..d110c992b046 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -3486,6 +3486,7 @@ vect_build_slp_store_interleaving (vec<slp_tree> 
&rhs_nodes,
        {
          SLP_TREE_CHILDREN (perm)
            .quick_push (SLP_TREE_CHILDREN (rhs_nodes[j])[l]);
+         SLP_TREE_CHILDREN (rhs_nodes[j])[l]->refcnt++;
          for (unsigned k = 0;
               k < SLP_TREE_SCALAR_STMTS (rhs_nodes[j]).length (); ++k)
            {
@@ -3949,6 +3950,9 @@ vect_build_slp_instance (vec_info *vinfo,
          /* Now we assume we can build the root SLP node from all stores.  */
          node = vect_build_slp_store_interleaving (rhs_nodes, scalar_stmts);
 
+         while (!rhs_nodes.is_empty ())
+           vect_free_slp_tree (rhs_nodes.pop ());
+
          /* Create a new SLP instance.  */
          slp_instance new_instance = XNEW (class _slp_instance);
          SLP_INSTANCE_TREE (new_instance) = node;

Reply via email to