diff --git a/gcc/testsuite/gcc.dg/vect/pr111860-2.c b/gcc/testsuite/gcc.dg/vect/pr111860-2.c new file mode 100644 index 0000000000000000000000000000000000000000..07f64ffb5318c9d7817d46802d123cc9a2d65ec9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr111860-2.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fno-tree-sink -ftree-vectorize" } */ +int buffer_ctrl_ctx_0, buffer_ctrl_p1, buffer_ctrl_cmd; + +int +buffer_ctrl (long ret, int i) +{ + switch (buffer_ctrl_cmd) + { + case 1: + buffer_ctrl_ctx_0 = 0; + for (; i; i++) + if (buffer_ctrl_p1) + ret++; + } + return ret; +} diff --git a/gcc/testsuite/gcc.dg/vect/pr111860-3.c b/gcc/testsuite/gcc.dg/vect/pr111860-3.c new file mode 100644 index 0000000000000000000000000000000000000000..07f64ffb5318c9d7817d46802d123cc9a2d65ec9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr111860-3.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fno-tree-sink -ftree-vectorize" } */ +int buffer_ctrl_ctx_0, buffer_ctrl_p1, buffer_ctrl_cmd; + +int +buffer_ctrl (long ret, int i) +{ + switch (buffer_ctrl_cmd) + { + case 1: + buffer_ctrl_ctx_0 = 0; + for (; i; i++) + if (buffer_ctrl_p1) + ret++; + } + return ret; +} diff --git a/gcc/testsuite/gcc.dg/vect/pr111860.c b/gcc/testsuite/gcc.dg/vect/pr111860.c new file mode 100644 index 0000000000000000000000000000000000000000..36f0774601040418bc6b7f27c9425b2bf93b18cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr111860.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +int optimize_path_n, optimize_path_d; +int *optimize_path_d_0; +extern void path_threeOpt( long); +void optimize_path() { + int i; + long length; + i = 0; + for (; i <= optimize_path_n; i++) + optimize_path_d = 0; + i = 0; + for (; i < optimize_path_n; i++) + length += optimize_path_d_0[i]; + path_threeOpt(length); +} diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index 1f7779b9834c3aef3c6a993fab916224fab03147..fc55278e63f7a48943fdc32c5e207110cf14507e 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -1626,13 +1626,33 @@ slpeel_tree_duplicate_loop_to_edge_cfg (class loop *loop, edge loop_exit, edge temp_e = redirect_edge_and_branch (exit, new_preheader); flush_pending_stmts (temp_e); } - /* Record the new SSA names in the cache so that we can skip materializing them again when we fill in the rest of the LCSSA variables. */ for (auto phi : new_phis) { tree new_arg = gimple_phi_arg (phi, 0)->def; new_phi_args.put (new_arg, gimple_phi_result (phi)); + + if (!SSA_VAR_P (new_arg)) + continue; + /* If the PHI MEM node dominates the loop then we shouldn't create + a new LC-SSSA PHI for it in the intermediate block. */ + gimple *def_stmt = SSA_NAME_DEF_STMT (new_arg); + basic_block def_bb = gimple_bb (def_stmt); + /* A MEM phi that consitutes a new DEF for the vUSE chain can either + be a .VDEF or a PHI that operates on MEM. */ + if (((gimple_vdef (def_stmt) || is_a (def_stmt)) + /* And said definition must not be inside the main loop. */ + && (!def_bb || !flow_bb_inside_loop_p (loop, def_bb))) + /* Or we must be a parameter. In the last two cases we may remove + a non-MEM PHI node, but since they dominate both loops the + removal is unlikely to cause trouble as the exits must already + be using them. */ + || SSA_NAME_IS_DEFAULT_DEF (new_arg)) + { + auto gsi = gsi_for_stmt (phi); + remove_phi_node (&gsi, true); + } } /* Copy the current loop LC PHI nodes between the original loop exit