1 void abort (void);
2
3 #define N 500
4 #define M 50
5
6 int X[2*N], Y[2*N], B[2*N];
7 int A[2*N][2*N], C[2*N][2*N];
8
9 static void __attribute__((noinline,noclone))
10 init (void)
11 {
12 volatile int i, j;
13
14 for (i = 0; i < 2 * N; ++i)
15 {
16 B[i] = 1;
17 X[i] = 1;
18 Y[i] = 1;
19 for (j = 0; j < 2 * N; ++j)
20 {
21 A[i][j] = 1;
22 C[i][j] = 1;
23 }
24 }
25 }
26
27 static void __attribute__((noinline,noclone))
28 foo (void)
29 {
30 int i, j, k;
31
32 for (i = 0; i < M; i++)
33 {
34 X[i] = Y[i] + 10;
35 for (j = 0; j < M; j++)
36 {
37 B[j] = A[j][N];
38 for (k = 0; k < N; k++)
39 {
40 A[j+1][k] = B[j] + C[j][k];
41 }
42 Y[i+j] = A[j+1][N];
43 }
44 }
45 }
46
47 static void __attribute__((noinline,noclone))
48 check (void)
49 {
50 volatile int i, j;
51
52 for (i = 0; i < 2 * N; ++i)
53 {
54 int expect_x = i < M ? 11 : 1;
55
56 if (B[i] != 1
57 || X[i] != expect_x
58 || Y[i] != 1)
59 abort ();
60
61 for (j = 0; j < 2 * N; ++j)
62 {
63 int expect_a = (0 < i && i <= M && j < N) ? 2 : 1;
64
65 if (A[i][j] != expect_a
66 || C[i][j] != 1)
67 abort ();
68 }
69 }
70 }
71
72 int main(void)
73 {
74 init ();
75 foo ();
76 check ();
77
78 return 0;
79 }
80
81 /* Check that parallel code generation part make the right answer. */
82 /* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 1 "graphite" } } */
83 /* { dg-final { scan-tree-dump-times "loopfn.0" 4 "optimized" } } */