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);
     }

Reply via email to