https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120927
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
So it's interesting, we somehow get a AVX vectorized main loop with a AVX512
vectorized masked epilog. It must have sth to do with max-iterations vs.
actually known ones, but
static const double a[] = { 1., 2., 3., 4., 5. };
void foo (double *b, double c, int n)
{
for (int i = 0; i < n; ++i)
b[i] = a[i] * c;
}
behaves sanely. Still the following makes us ICE compiling
the offending file from SPEC. I'm reducing now since I'm obviously
missing something here. Note that the above, with --param
vect-partial-vector-usage=1 gets us an "epilogue-only" vectorization
using masked AVX512 which was unexpected but kind-of makes sense.
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 2782d61a5fc..5e12fe0e213 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -3757,6 +3757,8 @@ vect_analyze_loop (class loop *loop, gimple
*loop_vectorized_call,
if (loop_vinfo)
{
+ gcc_assert (known_ge (first_vinfo_vf,
+ LOOP_VINFO_VECT_FACTOR (loop_vinfo)));
if (pick_lowest_cost_p
&& orig_loop_vinfo->epilogue_vinfo
&& vect_joust_loop_vinfos (loop_vinfo,