1/* { dg-require-effective-target vect_int } */ 2 3#include <stdlib.h> 4#include <stdarg.h> 5#include "tree-vect.h" 6 7#define N 16 8 9struct extraction 10{ 11 int a[N][N]; 12 int b[N][N]; 13}; 14 15static int a[N][N]; 16static int b[N][N]; 17static int c[N][N]; 18 19volatile int y; 20 21__attribute__ ((noinline)) 22int main1 (int x) { 23 int i,j, off; 24 struct extraction *p; 25 p = (struct extraction *) malloc (sizeof (struct extraction)); 26 for (i = 0; i < N; i++) 27 { 28 for (j = 0; j < N; j++) 29 { 30 a[i][j] = (i*7 + j*17)%53; 31 b[i][j] = (i*11+ j*13)%41; 32 if (y) 33 abort (); /* to avoid vectorization. */ 34 } 35 } 36 for (i = 0; i < N; i++) 37 { 38 for (j = 0; j < N; j++) 39 { 40 c[i][j] = a[i][j]; 41 if (y) 42 abort (); /* to avoid vectorization. */ 43 } 44 } 45 for (i = 1; i < N; i++) 46 { 47 for (j = 0; j < N; j++) 48 { 49 off = x + i + j + N+1; 50 if (x + i + j > N*N-1) 51 break; 52 if (off > N*N-1) 53 *(&c[0][0]+x+i+j) = *(&b[0][0] + off - N*N); 54 else 55 *(&c[0][0]+x+i+j) = *(&a[0][0] + off); 56 if (y) 57 abort (); /* to avoid vectorization. */ 58 } 59 } 60 61 for (i = 0; i < N; i++) 62 { 63 for (j = 0; j < N; j++) 64 { 65 p->a[i][j] = a[i][j]; 66 p->b[i][j] = b[i][j]; 67 /* Because Y is volatile, the compiler cannot move this check out 68 of the loop. */ 69 if (y) 70 abort (); /* to avoid vectorization. */ 71 } 72 } 73 74 /* Vectorizable: distance > number of iterations. */ 75 for (i = 1; i < N; i++) 76 { 77 for (j = 0; j < N; j++) 78 { 79 *((int *)p + x + i + j) = *((int *)p + x + i + j + N+1); 80 } 81 } 82 83 /* check results: */ 84 for (i = 0; i < N; i++) 85 { 86 for (j = 0; j < N; j++) 87 { 88 if (p->a[i][j] != c[i][j]) 89 abort (); 90 } 91 } 92 return 0; 93} 94 95int main (void) 96{ 97 check_vect (); 98 99 return main1 (N); 100} 101 102/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ 103/* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 2 "vect" { target { vect_no_align && { ! vect_hw_misalign } } } } } */ 104/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 0 "vect" } } */ 105/* { dg-final { cleanup-tree-dump "vect" } } */ 106 107