]> gcc.gnu.org Git - gcc.git/commitdiff
tree-optimization/105437 - BB vect with extern defs of throwing stmts
authorRichard Biener <rguenther@suse.de>
Mon, 2 May 2022 07:30:27 +0000 (09:30 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 2 May 2022 08:43:40 +0000 (10:43 +0200)
We have to watch out for vectorized stmt insert locations if the
def from the last stmt alters control flow.  We constrain region
building so we know the def is outside of the current region
and thus we can insert at the region start point.

2022-05-02  Richard Biener  <rguenther@suse.de>

PR tree-optimization/105437
* tree-vect-slp.cc (vect_schedule_slp_node): Handle the
case where last_stmt alters control flow.

* g++.dg/vect/pr105437.cc: New testcase.

gcc/testsuite/g++.dg/vect/pr105437.cc [new file with mode: 0644]
gcc/tree-vect-slp.cc

diff --git a/gcc/testsuite/g++.dg/vect/pr105437.cc b/gcc/testsuite/g++.dg/vect/pr105437.cc
new file mode 100644 (file)
index 0000000..b3b440d
--- /dev/null
@@ -0,0 +1,24 @@
+// { dg-do compile }
+
+struct ControlClass
+{
+    virtual ~ControlClass();
+
+    int Width;
+    int Height;
+    unsigned IsToRepaint : 1;
+};
+
+struct SelectClass : ControlClass
+{
+    SelectClass(void);
+};
+
+int Non_Folded_Value();
+
+SelectClass::SelectClass(void)
+{
+    int factor = Non_Folded_Value();
+    Width = 32 << factor;
+    Height = 24 << factor;
+}
index 805dd7e10e27d1a7f93255de69b2da8a6ab62bf4..0d400c00df1c3c6e78ef7c99093fec66a885a98e 100644 (file)
@@ -7302,6 +7302,13 @@ vect_schedule_slp_node (vec_info *vinfo,
          gcc_assert (seen_vector_def);
          si = gsi_after_labels (as_a <bb_vec_info> (vinfo)->bbs[0]);
        }
+      else if (is_ctrl_altering_stmt (last_stmt))
+       {
+         /* We split regions to vectorize at control altering stmts
+            with a definition so this must be an external which
+            we can insert at the start of the region.  */
+         si = gsi_after_labels (as_a <bb_vec_info> (vinfo)->bbs[0]);
+       }
       else if (is_a <bb_vec_info> (vinfo)
               && gimple_bb (last_stmt) != gimple_bb (stmt_info->stmt)
               && gimple_could_trap_p (stmt_info->stmt))
This page took 0.071815 seconds and 5 git commands to generate.