From: Richard Biener Date: Tue, 14 Feb 2023 10:10:56 +0000 (+0100) Subject: tree-optimization/108782 - nested first order recurrence vectorization X-Git-Tag: basepoints/gcc-14~1224 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=994224236e0231807681b62e880d3c2772c69521;p=thirdparty%2Fgcc.git tree-optimization/108782 - nested first order recurrence vectorization First order recurrence vectorization isn't possible for nested loops. PR tree-optimization/108782 * tree-vect-loop.cc (vect_phi_first_order_recurrence_p): Make sure we're not vectorizing an inner loop. * gcc.dg/torture/pr108782.c: New testcase. --- diff --git a/gcc/testsuite/gcc.dg/torture/pr108782.c b/gcc/testsuite/gcc.dg/torture/pr108782.c new file mode 100644 index 000000000000..1eac93db5741 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr108782.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-fno-tree-copy-prop" } */ + +int m; + +__attribute__ ((simd)) int +foo (void) +{ + unsigned a; + int b = 0; + + m = a = 1; + while (a != 0) + { + b = m; + m = 2; + ++a; + } + + return b; +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index becf96bb2b80..8387f7690b21 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -538,6 +538,10 @@ static bool vect_phi_first_order_recurrence_p (loop_vec_info loop_vinfo, class loop *loop, gphi *phi) { + /* A nested cycle isn't vectorizable as first order recurrence. */ + if (LOOP_VINFO_LOOP (loop_vinfo) != loop) + return false; + /* Ensure the loop latch definition is from within the loop. */ edge latch = loop_latch_edge (loop); tree ldef = PHI_ARG_DEF_FROM_EDGE (phi, latch);