When we have a vector shift with a scalar the shift operand can be
external - in that case we should not use the shift operand def
as hint where to place the vector shift instruction.  The ICE
in the PR is because stmt dominance queries only work inside of
the vector region.  But we should also never place stmts outside
of it.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        PR tree-optimization/121202
        * tree-vect-slp.cc (vect_schedule_slp_node): Do not take
        an out-of-region stmt as "last".

        * gcc.dg/pr121202.c: New testcase.
---
 gcc/testsuite/gcc.dg/pr121202.c | 11 +++++++++++
 gcc/tree-vect-slp.cc            |  6 +++++-
 2 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr121202.c

diff --git a/gcc/testsuite/gcc.dg/pr121202.c b/gcc/testsuite/gcc.dg/pr121202.c
new file mode 100644
index 00000000000..30ecf4a5e01
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr121202.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-tree-copy-prop" } */
+
+int a, b, c;
+int e(int f, int g) { return f >> g; }
+int h(int f) { return a > 1 ? 0 : f << a; }
+int main() {
+  while (c--)
+    b = e(h(1), a);
+  return 0;
+}
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index fccf262217f..5f414790354 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -11419,7 +11419,11 @@ vect_schedule_slp_node (vec_info *vinfo,
                  && !SSA_NAME_IS_DEFAULT_DEF (def))
                {
                  gimple *stmt = SSA_NAME_DEF_STMT (def);
-                 if (!last_stmt)
+                 if (gimple_uid (stmt) == -1u)
+                   /* If the stmt is not inside the region do not
+                      use it as possible insertion point.  */
+                   ;
+                 else if (!last_stmt)
                    last_stmt = stmt;
                  else if (vect_stmt_dominates_stmt_p (last_stmt, stmt))
                    last_stmt = stmt;
-- 
2.43.0

Reply via email to