https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127410

--- Comment #3 from ptomsich at gcc dot gnu.org ---
Squashing the costing before re-costing works for our use case.
If this design (see below) is acceptable, I'd send this to the mailing list;
if not, please let me know what other designs you'd like us to look at.

The proposed change:

diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index f7ff5a52214..6b9c4ee85cb 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -10513,6 +10513,35 @@ vect_slp_undo_demotions (vec<slp_demotion> &demoted)
   demoted.truncate (0);
 }

+/* Reset the analysis state of the SLP tree rooted at NODE, using VISITED to
+   avoid re-walking shared nodes.  Re-analysis has to start from a clean
+   state, as recorded data would otherwise be merged into rather than
+   replaced.  */
+
+static void
+vect_slp_reset_analysis (slp_tree node, hash_set<slp_tree> &visited)
+{
+  if (!node || visited.add (node))
+    return;
+
+  SLP_TREE_TYPE (node) = undef_vec_info_type;
+  if (node->data)
+    {
+      delete node->data;
+      node->data = nullptr;
+    }
+
+  for (slp_tree child : SLP_TREE_CHILDREN (node))
+    vect_slp_reset_analysis (child, visited);
+}
+
+static void
+vect_slp_reset_analysis (slp_tree node)
+{
+  hash_set<slp_tree> visited;
+  vect_slp_reset_analysis (node, visited);
+}
+
 /* Return true if every live lane in the SLP tree rooted at ROOT can still
    be extracted where BB_VINFO's placement now puts its node.  Liveness
    was decided against an earlier placement, and a demotion can move a
@@ -10854,7 +10883,8 @@ vect_slp_region (vec<basic_block> bbs,
vec<data_reference_p> datarefs,
                              continue;
                            }
                          /* Re-analyze the modified instance and judge it
-                            alone.  */
+                            alone, discarding any recorded state first.  */
+                         vect_slp_reset_analysis (SLP_INSTANCE_TREE (e));
                          hash_set<slp_tree> avisited;
                          auto_vec<slp_tree> avisited_vec;
                          stmt_vector_for_cost cost_vec;

Reply via email to