--- /dev/null
+/* { dg-do run } */
+/* { dg-additional-options "-ftree-vectorize -fno-vect-cost-model" } */
+/* { dg-additional-options "-mavx2" { target avx2_runtime } } */
+
+double getdot(int n, const double *x, int inc_x, const double *y)
+{
+ int i, ix = 0;
+ double dot[4] = { 0.0, 0.0, 0.0, 0.0 } ;
+
+ for(i = 0; i < n; i++) {
+ dot[0] += x[ix] * y[ix] ;
+ dot[1] += x[ix+1] * y[ix+1] ;
+ dot[2] += x[ix] * y[ix+1] ;
+ dot[3] += x[ix+1] * y[ix] ;
+ ix += inc_x ;
+ }
+
+ return dot[0] + dot[1] + dot[2] + dot[3];
+}
+
+int main()
+{
+ double x[2] = {0, 0}, y[2] = {0, 0};
+ if (getdot(1, x, 4096*4096, y) != 0.)
+ __builtin_abort ();
+ return 0;
+}
unsigned int group_el = 0;
unsigned HOST_WIDE_INT
elsz = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (vectype)));
+ unsigned int n_groups = 0;
for (j = 0; j < ncopies; j++)
{
if (nloads > 1)
if (! slp
|| group_el == group_size)
{
- tree newoff = copy_ssa_name (running_off);
- gimple *incr = gimple_build_assign (newoff, POINTER_PLUS_EXPR,
- running_off, stride_step);
- vect_finish_stmt_generation (vinfo, stmt_info, incr, gsi);
-
- running_off = newoff;
+ n_groups++;
+ /* When doing SLP make sure to not load elements from
+ the next vector iteration, those will not be accessed
+ so just use the last element again. See PR107451. */
+ if (!slp || known_lt (n_groups, vf))
+ {
+ tree newoff = copy_ssa_name (running_off);
+ gimple *incr
+ = gimple_build_assign (newoff, POINTER_PLUS_EXPR,
+ running_off, stride_step);
+ vect_finish_stmt_generation (vinfo, stmt_info, incr, gsi);
+ running_off = newoff;
+ }
group_el = 0;
}
}