From: Richard Biener Date: Tue, 7 Sep 2021 09:46:00 +0000 (+0200) Subject: tree-optimization/102226 - fix epilogue vector re-use X-Git-Tag: basepoints/gcc-13~4932 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=843068149ec8fcaaaec12751f5b70221a1153857;p=thirdparty%2Fgcc.git tree-optimization/102226 - fix epilogue vector re-use This fixes re-use of the reduction value in epilogue vectorization when a conversion from/to variable lenght vectors is required. 2021-09-07 Richard Biener PR tree-optimization/102226 * tree-vect-loop.c (vect_transform_cycle_phi): Record the converted value for the epilogue PHI use. * g++.dg/vect/pr102226.cc: New testcase. --- diff --git a/gcc/testsuite/g++.dg/vect/pr102226.cc b/gcc/testsuite/g++.dg/vect/pr102226.cc new file mode 100644 index 000000000000..ddf5e460c28e --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr102226.cc @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-additional-options "-msve-vector-bits=128" { target aarch64_sve } } + +template struct b { using c = a; }; +template class> using f = b; +template class g> +using h = typename f::c; +struct i { + template using k = typename j::l; +}; +struct m : i { + using l = h; +}; +class n { +public: + char operator[](long o) { + m::l s; + return s[o]; + } +} p; +n r; +int q() { + long d; + for (long e; e; e++) + if (p[e] == r[e]) + d++; + return d; +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 0c8d992624b5..c9dcc647d2c3 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -7755,11 +7755,11 @@ vect_transform_cycle_phi (loop_vec_info loop_vinfo, (reduc_info), &stmts); } + if (!useless_type_conversion_p (vectype_out, TREE_TYPE (def))) + def = gimple_convert (&stmts, vectype_out, def); /* Adjust the input so we pick up the partially reduced value for the skip edge in vect_create_epilog_for_reduction. */ accumulator->reduc_input = def; - if (!useless_type_conversion_p (vectype_out, TREE_TYPE (def))) - def = gimple_convert (&stmts, vectype_out, def); if (loop_vinfo->main_loop_edge) { /* While we'd like to insert on the edge this will split