The following makes sure to always CSE when there's SLP_TREE_SCALAR_STMTS as otherwise a chain of two-operator node operations can result in exponential behavior of the CSE process as likely seen when building 510.parest on aarch64.
Bootstrap and regtest running on x86_64-unknown-linux-gnu. PR tree-optimization/115597 * tree-vect-slp.cc (vect_cse_slp_nodes): Allow to CSE VEC_PERM nodes. --- gcc/tree-vect-slp.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index 9465d94de1a..212d5f97f7d 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -6085,7 +6085,6 @@ static void vect_cse_slp_nodes (scalar_stmts_to_slp_tree_map_t *bst_map, slp_tree& node) { if (SLP_TREE_DEF_TYPE (node) == vect_internal_def - && SLP_TREE_CODE (node) != VEC_PERM_EXPR /* Besides some VEC_PERM_EXPR, two-operator nodes also lack scalar stmts and thus CSE doesn't work via bst_map. Ideally we'd have sth that works for all internal and external nodes. */ -- 2.43.0