slp: elide intermediate nodes for complex add and avoid truncate
authorTamar Christina <tamar.christina@arm.com>
Thu, 14 Jan 2021 20:49:55 +0000 (20:49 +0000)
committerTamar Christina <tamar.christina@arm.com>
Thu, 14 Jan 2021 20:49:55 +0000 (20:49 +0000)
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.

gcc/tree-vect-slp-patterns.c

index 3903cdb1169ac70b8738a01c13e0fb8dc3022fc2..c4fa269baa3ceb2142443624a6cb46f8f90533d9 100644 (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);
 }