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 64
8float in[N+M];
9float coeff[M];
10float out[N];
11float fir_out[N];
12
13/* Vectorized.  Fixed misaligment in the inner-loop.  */
14__attribute__ ((noinline))
15void foo (){
16 int i,j,k;
17 float diff;
18
19 for (i = 0; i < N; i++) {
20  out[i] = 0;
21 }
22
23 for (k = 0; k < 4; k++) {
24  for (i = 0; i < N; i++) {
25    diff = 0;
26    j = k;
27
28    do {
29      diff += in[j+i]*coeff[j];
30      j+=4;
31    } while (j < M);
32
33    out[i] += diff;
34  }
35 }
36
37}
38
39/* Vectorized.  Changing misalignment in the inner-loop.  */
40__attribute__ ((noinline))
41void fir (){
42  int i,j,k;
43  float diff;
44
45  for (i = 0; i < N; i++) {
46    diff = 0;
47    for (j = 0; j < M; j++) {
48      diff += in[j+i]*coeff[j];
49    }
50    fir_out[i] = diff;
51  }
52}
53
54
55int main (void)
56{
57  check_vect ();
58  int i, j;
59  float diff;
60
61  for (i = 0; i < M; i++)
62    coeff[i] = i;
63  for (i = 0; i < N+M; i++)
64    in[i] = i;
65
66  foo ();
67  fir ();
68
69  for (i = 0; i < N; i++) {
70    if (out[i] != fir_out[i])
71      abort ();
72  }
73
74  return 0;
75}
76
77/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 2 "vect" { xfail { vect_no_align && { ! vect_hw_misalign } } } } } */
78/* { dg-final { cleanup-tree-dump "vect" } } */
79