We cannot use a random stmt at region start as marker as that might
eventually be a control stmt.  Instead use NULL to mark region
start as documented.

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

        PR tree-optimization/126861
        * tree-vect-slp.cc (vect_schedule_slp_node): Use NULL for
        scheduling at region start.

        * g++.dg/vect/slp-pr126861.cc: New testcase.
---
 gcc/testsuite/g++.dg/vect/slp-pr126861.cc | 11 +++++++++++
 gcc/tree-vect-slp.cc                      |  3 +--
 2 files changed, 12 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/vect/slp-pr126861.cc

diff --git a/gcc/testsuite/g++.dg/vect/slp-pr126861.cc 
b/gcc/testsuite/g++.dg/vect/slp-pr126861.cc
new file mode 100644
index 00000000000..d9e5f4ea075
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/slp-pr126861.cc
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+struct Guard { ~Guard(); };
+void init();
+
+int f (unsigned n1, unsigned n2)
+{
+  Guard g;
+  init();
+  return (n1 != 0) + (n2 != 0);
+}
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index aa3f1318f87..89a67e4eb38 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -12277,8 +12277,7 @@ vect_schedule_slp_node (vec_info *vinfo,
       else if (!last_stmt)
        {
          si = gsi_after_labels (vinfo->bbs[0]);
-         /* ???  last_stmt can be NULL if the block is empty.  */
-         last_stmt = gsi_stmt (si);
+         /* last_stmt NULL marks the region start.  */
        }
       else if (is_a <gphi *> (last_stmt))
        si = gsi_after_labels (gimple_bb (last_stmt));
-- 
2.51.0

Reply via email to