1/* { dg-require-effective-target vect_float } */
2
3#include <stdarg.h>
4#include "tree-vect.h"
5
6#define N 40
7#define M 128
8float in[N+M];
9float coeff[M];
10float out[N];
11
12/* Outer-loop vectorization.  */
13
14__attribute__ ((noinline)) void
15foo (){
16  int i,j;
17  float diff;
18
19  for (i = 0; i < N; i++) {
20    diff = 0;
21    for (j = 0; j < M; j+=4) {
22      diff += in[j+i]*coeff[j];
23    }
24    out[i]=diff;
25  }
26}
27
28int main (void)
29{
30  check_vect ();
31  int i, j;
32  float diff;
33
34  for (i = 0; i < M; i++)
35    coeff[i] = i;
36  for (i = 0; i < N+M; i++)
37    in[i] = i;
38
39  foo ();
40
41  for (i = 0; i < N; i++) {
42    diff = 0;
43    for (j = 0; j < M; j+=4) {
44      diff += in[j+i]*coeff[j];
45    }
46    if (out[i] != diff)
47      abort ();
48  }
49
50  return 0;
51}
52
53/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" } } */
54/* { dg-final { scan-tree-dump-times "zero step in outer loop." 1 "vect" } } */
55/* { dg-final { cleanup-tree-dump "vect" } } */
56