]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end: Insert invariant instructions before the gsi [PR116812]
authorTamar Christina <tamar.christina@arm.com>
Mon, 23 Sep 2024 10:45:43 +0000 (11:45 +0100)
committerTamar Christina <tamar.christina@arm.com>
Mon, 23 Sep 2024 10:45:43 +0000 (11:45 +0100)
The new invariant statements should be inserted before the current
statement and not after.  This goes fine 99% of the time but when the
current statement is a gcond the control flow gets corrupted.

gcc/ChangeLog:

PR tree-optimization/116812
* tree-vect-slp.cc (vect_slp_region): Fix insertion.

gcc/testsuite/ChangeLog:

PR tree-optimization/116812
* gcc.dg/vect/pr116812.c: New test.

gcc/testsuite/gcc.dg/vect/pr116812.c [new file with mode: 0644]
gcc/tree-vect-slp.cc

diff --git a/gcc/testsuite/gcc.dg/vect/pr116812.c b/gcc/testsuite/gcc.dg/vect/pr116812.c
new file mode 100644 (file)
index 0000000..3e83c13
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O2 -fno-tree-dce -fno-tree-dse" } */
+
+int a, b, c, d, e, f[2], g, h;
+int k(int j) { return 2 >> a ? 2 >> a : a; }
+int main() {
+  int i;
+  for (; g; g = k(d = 0))
+    ;
+  if (a)
+    b && h;
+  for (e = 0; e < 2; e++)
+    c = d & 1 ? d : 0;
+  for (i = 0; i < 2; i++)
+    f[i] = 0;
+  return 0;
+}
index 600987dd6e5d506aa5fbb02350f9dab77793d382..7161492f5114ddb589ada700e5cd91a29627eba0 100644 (file)
@@ -9168,10 +9168,8 @@ vect_slp_region (vec<basic_block> bbs, vec<data_reference_p> datarefs,
                dump_printf_loc (MSG_NOTE, vect_location,
                         "------>generating invariant statements\n");
 
-             gimple_stmt_iterator gsi;
-             gsi = gsi_after_labels (bb_vinfo->bbs[0]);
-             gsi_insert_seq_after (&gsi, bb_vinfo->inv_pattern_def_seq,
-                                   GSI_CONTINUE_LINKING);
+             bb_vinfo->insert_seq_on_entry (NULL,
+                                            bb_vinfo->inv_pattern_def_seq);
            }
        }
       else