It turns out decide_masked_load_lanes accesses a stale SLP graph so the following re-builds it instead.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/117343 * tree-vect-slp.cc (vect_optimize_slp_pass::build_vertices): Support re-building the SLP graph. (vect_optimize_slp_pass::run): Re-build the SLP graph before decide_masked_load_lanes. --- gcc/tree-vect-slp.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 2e98a943e06..a7f064bb0ed 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -5632,6 +5632,8 @@ vect_optimize_slp_pass::build_vertices () hash_set<slp_tree> visited; unsigned i; slp_instance instance; + m_vertices.truncate (0); + m_leafs.truncate (0); FOR_EACH_VEC_ELT (m_vinfo->slp_instances, i, instance) build_vertices (visited, SLP_INSTANCE_TREE (instance)); } @@ -7244,6 +7246,8 @@ vect_optimize_slp_pass::run () } else remove_redundant_permutations (); + free_graph (m_slpg); + build_graph (); decide_masked_load_lanes (); free_graph (m_slpg); } -- 2.43.0