1 /* { dg-require-effective-target vect_float } */ 2 3 #include <stdarg.h> 4 #include "tree-vect.h" 5 6 #define N 80 7 #define M 128 8 float in[N+M]; 9 float coeff[M]; 10 float out[N]; 11 float fir_out[N]; 12 13 /* Vectorized. Fixed misaligment in the inner-loop. */ 14 __attribute__ ((noinline)) foo()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)) fir()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 main(void)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