1/* { dg-require-effective-target vect_int } */
2
3#include <stdarg.h>
4#include "tree-vect.h"
5
6#define N 64
7
8int ia[N + 1];
9int ib[N + 1];
10
11/* Vectorizable. Dependence distance -1.  */
12__attribute__((noinline)) void
13f1 (void)
14{
15  int i;
16  for (i = 0; i < N; i++)
17    {
18      ia[i + 1] = 1;
19      ib[i] = ia[i];
20    }
21}
22
23/* Not vectorizable due to data dependence: dependence distance 1.  */
24__attribute__((noinline)) void
25f2 (void)
26{
27  int i;
28  for (i = 0; i < N; i++)
29    {
30      ia[i] = 1;
31      ib[i] = ia[i + 1];
32    }
33}
34
35/* Not vectorizable due to data dependence: dependence distance 1.  */
36__attribute__((noinline)) void
37f3 (void)
38{
39  int i;
40  for (i = N - 1; i >= 0; i--)
41    {
42      ia[i + 1] = 1;
43      ib[i] = ia[i];
44    }
45}
46
47/* Vectorizable. Dependence distance -1.  */
48__attribute__((noinline)) void
49f4 (void)
50{
51  int i;
52  for (i = N - 1; i >= 0; i--)
53    {
54      ia[i] = 1;
55      ib[i] = ia[i + 1];
56    }
57}
58
59/* Vectorizable. Dependence distance -1.  */
60__attribute__((noinline)) void
61f5 (void)
62{
63  int i;
64  for (i = 0; i < N; i++)
65    {
66      ia[i + 1] = 1;
67      ia[i] = 2;
68    }
69}
70
71/* Not vectorizable due to data dependence: dependence distance 1.  */
72__attribute__((noinline)) void
73f6 (void)
74{
75  int i;
76  for (i = 0; i < N; i++)
77    {
78      ia[i] = 1;
79      ia[i + 1] = 2;
80    }
81}
82
83/* Not vectorizable due to data dependence: dependence distance 1.  */
84__attribute__((noinline)) void
85f7 (void)
86{
87  int i;
88  for (i = N - 1; i >= 0; i--)
89    {
90      ia[i + 1] = 1;
91      ia[i] = 2;
92    }
93}
94
95/* Vectorizable. Dependence distance -1.  */
96__attribute__((noinline)) void
97f8 (void)
98{
99  int i;
100  for (i = N - 1; i >= 0; i--)
101    {
102      ia[i] = 1;
103      ia[i + 1] = 2;
104    }
105}
106
107__attribute__ ((noinline)) int
108main1 (void)
109{
110  int i, j;
111
112  for (j = 0; j < 8; j++)
113    {
114      for (i = 0; i <= N; i++)
115	{
116	  ia[i] = i + 3;
117	  ib[i] = i + N + 3;
118	  asm ("");
119	}
120
121      switch (j)
122	{
123	case 0: f1 (); break;
124	case 1: f2 (); break;
125	case 2: f3 (); break;
126	case 3: f4 (); break;
127	case 4: f5 (); break;
128	case 5: f6 (); break;
129	case 6: f7 (); break;
130	case 7: f8 (); break;
131	}
132
133      for (i = 0; i <= N; i++)
134	{
135	  int ea = i + 3;
136	  int eb = i + N + 3;
137	  switch (j)
138	    {
139	    case 0:
140	      if (i) ea = 1;
141	      if (i == 0) eb = 3;
142	      else if (i != N) eb = 1;
143	      break;
144	    case 1:
145	      if (i != N) ea = 1;
146	      if (i != N) eb = i + 4;
147	      break;
148	    case 2:
149	      if (i) ea = 1;
150	      if (i != N) eb = i + 3;
151	      break;
152	    case 3:
153	      if (i != N) ea = 1;
154	      if (i < N - 1) eb = 1;
155	      else if (i == N - 1) eb = 67;
156	      break;
157	    case 4:
158	      ea = 1 + (i != N);
159	      break;
160	    case 5:
161	      ea = 2 - (i != N);
162	      break;
163	    case 6:
164	      ea = 1 + (i == 0);
165	      break;
166	    case 7:
167	      ea = 2 - (i == 0);
168	      break;
169	    }
170	  if (ia[i] != ea || ib[i] != eb)
171	    abort ();
172	}
173    }
174
175  return 0;
176}
177
178int main ()
179{
180  check_vect ();
181
182  return main1 ();
183}
184
185/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" {xfail { vect_no_align && { ! vect_hw_misalign } } } } } */
186/* { dg-final { scan-tree-dump-times "dependence distance negative" 4 "vect"  } } */
187/* { dg-final { cleanup-tree-dump "vect" } } */
188