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.
This commit is contained in:
Richard Biener 2024-08-28 11:04:07 +02:00 committed by Richard Biener
parent ad895a2890
commit 04065d8c30

View file

@ -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;