[gcc r16-9094] tree-optimization/125477 - verify we can copy it before versioning an outer loop
Richard Biener
rguenth@gcc.gnu.org
Mon Jun 15 13:38:01 GMT 2026
https://gcc.gnu.org/g:5a03cc5b7f9b2dbcfd15a93f4c0ab5f40f7b17e2
commit r16-9094-g5a03cc5b7f9b2dbcfd15a93f4c0ab5f40f7b17e2
Author: Richard Biener <rguenther@suse.de>
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);
}
More information about the Gcc-cvs
mailing list