[gcc r15-11487] tree-optimization/125477 - verify we can copy it before versioning an outer loop

Richard Biener via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:bbc3f5557076546cf50ec61fc32cca2b56603a2f

commit r15-11487-gbbc3f5557076546cf50ec61fc32cca2b56603a2f
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 56a4e9a8b63f..e4b7052234ec 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -4149,7 +4149,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);
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.