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