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))
        {

Reply via email to