https://gcc.gnu.org/g:5a03cc5b7f9b2dbcfd15a93f4c0ab5f40f7b17e2
commit r16-9094-g5a03cc5b7f9b2dbcfd15a93f4c0ab5f40f7b17e2 Author: Richard Biener <[email protected]> Date: Tue Jun 2 15:41:07 2026 +0200 tree-optimization/125477 - verify we can copy it before versioning an outer loop The following fixes a hole in vectorizer loop versioning which tries to version an outer loop that the versioning condition is invariant in but fails to verify we can actually copy it. PR tree-optimization/125477 * tree-vect-loop-manip.cc (vect_loop_versioning): Verify we can duplicate an outer loop before considering to version it. * gcc.dg/torture/pr125477.c: New testcase. (cherry picked from commit bfac2983b69f6cc6631aa7bfd1058eed37d7a425) Diff: --- gcc/testsuite/gcc.dg/torture/pr125477.c | 17 +++++++++++++++++ gcc/tree-vect-loop-manip.cc | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/torture/pr125477.c b/gcc/testsuite/gcc.dg/torture/pr125477.c new file mode 100644 index 000000000000..683c204ecbdb --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr125477.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +void f123(void) __attribute__((__returns_twice__)); +int c; +volatile int i; +void e(long *a, long *d, int f) { +g: + if (i) + return; + f123(); + for (;;) { + __asm__ goto("" : : : : g); + c = 0; + for (; c < f; c++) + a[c] = d[c]; + } +} diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index cd1ea746ae45..a5a3bb39e0ee 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -4428,7 +4428,8 @@ vect_loop_versioning (loop_vec_info loop_vinfo, && (!loop_outer (loop_to_version)->inner->next || vect_loop_vectorized_call (loop_to_version)) && (!loop_outer (loop_to_version)->inner->next - || !loop_outer (loop_to_version)->inner->next->next)) + || !loop_outer (loop_to_version)->inner->next->next) + && can_duplicate_loop_p (loop_outer (loop_to_version))) loop_to_version = loop_outer (loop_to_version); }
