slp: elide intermediate nodes for complex add and avoid truncate

This applies the same feedback received for MUL and the rest to
ADD which was already committed.  In short it elides the intermediate
nodes vec and avoids the use of truncate on the SLP child.

gcc/ChangeLog:

	* tree-vect-slp-patterns.c (complex_add_pattern::build):
	Elide nodes.
This commit is contained in:
Tamar Christina 2021-01-14 20:49:55 +00:00
parent dea4a32b24
commit fe70119531

View File

@ -627,23 +627,21 @@ class complex_add_pattern : public complex_pattern
void
complex_add_pattern::build (vec_info *vinfo)
{
auto_vec<slp_tree> nodes;
SLP_TREE_CHILDREN (*this->m_node).reserve_exact (2);
slp_tree node = this->m_ops[0];
vec<slp_tree> children = SLP_TREE_CHILDREN (node);
/* First re-arrange the children. */
nodes.create (children.length ());
nodes.quick_push (children[0]);
nodes.quick_push (vect_build_swap_evenodd_node (children[1]));
SLP_TREE_CHILDREN (*this->m_node)[0] = children[0];
SLP_TREE_CHILDREN (*this->m_node)[1] =
vect_build_swap_evenodd_node (children[1]);
SLP_TREE_REF_COUNT (nodes[0])++;
SLP_TREE_REF_COUNT (nodes[1])++;
SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (*this->m_node)[0])++;
SLP_TREE_REF_COUNT (SLP_TREE_CHILDREN (*this->m_node)[1])++;
vect_free_slp_tree (this->m_ops[0]);
vect_free_slp_tree (this->m_ops[1]);
SLP_TREE_CHILDREN (*this->m_node).truncate (0);
SLP_TREE_CHILDREN (*this->m_node).safe_splice (nodes);
complex_pattern::build (vinfo);
}