https://gcc.gnu.org/g:04f26dfb261677b094602f3d6428de183ddebc5b
commit r17-5408-g04f26dfb261677b094602f3d6428de183ddebc5b Author: Richard Biener <[email protected]> Date: Tue Oct 20 11:11:52 2026 +0200 tree-optimization/128014 - live lane extracts from externs When we have a live lane from an extern make sure to insert that at region boundary rather than in arbitrary external place (including after a returns-twice call which ICEs). PR tree-optimization/128014 * tree-vect-loop.cc (vectorizable_live_operation): Also insert extracts from external vector defs on region entry. * gcc.dg/vect/bb-slp-pr128014.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/vect/bb-slp-pr128014.c | 17 +++++++++++++++++ gcc/tree-vect-loop.cc | 6 +++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr128014.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr128014.c new file mode 100644 index 000000000000..d27fc034eccd --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr128014.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +typedef unsigned long v2du __attribute__ ((vector_size (16))); +extern int rt (void) __attribute__ ((returns_twice)); +extern v2du getv (void); +extern void use (unsigned long); + +void +f (v2du *pv) +{ + rt (); + v2du v = getv (); + unsigned long a0 = v[0], a1 = v[1]; + pv[1] = (v2du) { a0 ^ 5, a1 ^ 5 }; + use (a1); + rt (); +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 1b76358ec11b..cfd03a97368b 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -10454,7 +10454,11 @@ vectorizable_live_operation (vec_info *vinfo, stmt_vec_info stmt_info, && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs)) SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_tree) = 1; gimple *vec_stmt = SSA_NAME_DEF_STMT (vec_lhs); - if (TREE_CODE (vec_lhs) != SSA_NAME || SSA_NAME_IS_DEFAULT_DEF (vec_lhs)) + if (TREE_CODE (vec_lhs) != SSA_NAME + || SSA_NAME_IS_DEFAULT_DEF (vec_lhs) + || (vinfo->bbs[0] != gimple_bb (vec_stmt) + && dominated_by_p (CDI_DOMINATORS, vinfo->bbs[0], + gimple_bb (vec_stmt)))) vinfo->insert_seq_on_entry (stmt_info, stmts); else if (is_a <gphi *> (vec_stmt)) {
