https://gcc.gnu.org/g:09892448ebd8c396a26b2c09ba71f1e5a8dc42d7

commit r15-3792-g09892448ebd8c396a26b2c09ba71f1e5a8dc42d7
Author: Tamar Christina <tamar.christ...@arm.com>
Date:   Mon Sep 23 11:45:43 2024 +0100

    middle-end: Insert invariant instructions before the gsi [PR116812]
    
    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.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr116812.c | 17 +++++++++++++++++
 gcc/tree-vect-slp.cc                 |  6 ++----
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/vect/pr116812.c 
b/gcc/testsuite/gcc.dg/vect/pr116812.c
new file mode 100644
index 000000000000..3e83c13d94bd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr116812.c
@@ -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;
+}
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 600987dd6e5d..7161492f5114 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -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

Reply via email to