1 /* { dg-do run } */
2 /* { dg-require-effective-target vect_double } */
3 
4 #include "tree-vect.h"
5 
6 void __attribute__((noinline,noclone))
foo(double * a4,int n)7 foo (double *a4, int n)
8 {
9   for (int i = 0; i < n; ++i)
10     {
11       /* We may not apply interleaving to the group (a), (b) because of (c).  */
12       double tem1 = a4[i*4] + a4[i*4+n*4] /* (a) */;
13       double tem2 = a4[i*4+2*n*4+1];
14       a4[i*4+n*4+1] = tem1; /* (c) */
15       a4[i*4+1] = tem2;
16       double tem3 = a4[i*4] - tem2;
17       double tem4 = tem3 + a4[i*4+n*4];
18       a4[i*4+n*4+1] = tem4 + a4[i*4+n*4+1] /* (b) */;
19     }
20 }
main(int argc,char ** argv)21 int main(int argc, char **argv)
22 {
23   int n = 11;
24   double a4[4 * n * 3];
25   double a42[4 * n * 3];
26   check_vect ();
27   for (int i = 0; i < 4 * n * 3; ++i)
28     a4[i] = a42[i] = i;
29   foo (a4, n);
30   for (int i = 0; i < n; ++i)
31     {
32       double tem1 = a42[i*4] + a42[i*4+n*4];
33       double tem2 = a42[i*4+2*n*4+1];
34       a42[i*4+n*4+1] = tem1;
35       a42[i*4+1] = tem2;
36       double tem3 = a42[i*4] - tem2;
37       double tem4 = tem3 + a42[i*4+n*4];
38       a42[i*4+n*4+1] = tem4 + a42[i*4+n*4+1];
39       __asm__ volatile ("": : : "memory");
40     }
41   for (int i = 0; i < 4 * n * 3; ++i)
42     if (a4[i] != a42[i])
43       __builtin_abort ();
44   return 0;
45 }
46 
47 /* { dg-final { scan-tree-dump "READ_WRITE dependence in interleaving" "vect" } } */
48