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