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;