When an external vector def defined by a control statement is scheduled
we correctly place it. But when we later re-run the placing during
transform we look at the actual vector def and assert before we are
eventually adjusting the location again. Mind we cannot simply re-use
the computed schedule, so adjust the assert to treat externs the same
as !last_stmt.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/127811
* tree-vect-slp.cc (vect_schedule_slp_node): Allow extern
last_stmt during transform.
* g++.dg/vect/pr127811.cc: New testcase.
---
gcc/testsuite/g++.dg/vect/pr127811.cc | 15 +++++++++++++++
gcc/tree-vect-slp.cc | 7 ++++++-
2 files changed, 21 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/vect/pr127811.cc
diff --git a/gcc/testsuite/g++.dg/vect/pr127811.cc
b/gcc/testsuite/g++.dg/vect/pr127811.cc
new file mode 100644
index 00000000000..8d4efdb0057
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr127811.cc
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+#define vector(type, elm) type __attribute__ ((vector_size (sizeof(type)*elm)))
+
+typedef vector(float,4) v4float;
+v4float get (void);
+struct s1 { ~s1(); };
+
+void
+f (v4float *r)
+{
+ s1 guard;
+ v4float v = get ();
+ *r = (v4float) { v[0] + 1, v[1] + 1, v[2] + 1, v[3] + 1 };
+}
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 00ed4d3fec1..558517819f5 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -12376,7 +12376,12 @@ vect_schedule_slp_node (vec_info *vinfo,
/* We split regions to vectorize at control altering stmts
with a definition so this can only be an external. */
gcc_checking_assert (!last_stmt
- || !is_ctrl_altering_stmt (last_stmt));
+ || !is_ctrl_altering_stmt (last_stmt)
+ /* Existing vector defs can be external, we will
+ adjust the insertion point below. */
+ || (!place_only
+ && dominated_by_p (CDI_DOMINATORS, vinfo->bbs[0],
+ gimple_bb (last_stmt))));
if (is_a <bb_vec_info> (vinfo)
&& !SLP_TREE_PERMUTE_P (node)
base-commit: 9b4df7d052915431725e58156754dfb077b915c1
prerequisite-patch-id: e52d299db98b0892f974152cd9fa5f6859fec5b7
prerequisite-patch-id: 39da6ec3264bae454fa504f127cd5b80a0662f04
prerequisite-patch-id: 6d6c263a964425334ad8c2edd4dd89dcbff44bfe
prerequisite-patch-id: 9a12a1706cbdff1edf8959682cd3cf9d900cd8f1
prerequisite-patch-id: dcb6febf1dbf6ea505f87a9c8c3572804a12819e
prerequisite-patch-id: b24057443c46d6979436cce479836178b19355de
prerequisite-patch-id: d61bf2c4249ecd3d9da5eeda002d332ed3a8b4fd
prerequisite-patch-id: 59cbeca60f782f48f945bc532c2235a50de6f0e5
prerequisite-patch-id: 8eddd3172e2007d0fc591124a56b372dfe83e683
prerequisite-patch-id: 862842dd3742066d039f66ffe9528bc490308c50
prerequisite-patch-id: e413d39d9af45f25483eaf229cf883c771444fbb
prerequisite-patch-id: 2faef186ad1d816bb104d89638bc4cec6d863a46
prerequisite-patch-id: b32cceb111f4f57798e4b1d58822281e7bbaf25e
prerequisite-patch-id: 404fd84b023dbe3994be05f26d6a86e83486d405
--
2.51.0