1 /* { dg-do run } */
2 /* { dg-options "-O2 -floop-interchange -fdump-tree-linterchange-details" } */
3 /* { dg-require-effective-target size20plus } */
4 /* { dg-skip-if "too big data segment" { visium-*-* } } */
5 
6 #define M 256
7 int a[M][M], b[M][M], c[M][M], d[M][M];
8 void __attribute__((noinline))
matrix_mul_1(int n)9 matrix_mul_1 (int n)
10 {
11     for (int j = 0; j < n; j++)
12       for (int k = 0; k < n; k++)
13   for (int i = 0; i < n; i++)
14         c[i][j] = c[i][j] + a[i][k]*b[k][j];
15 }
16 
17 void __attribute__((noinline))
matrix_mul_2(int n)18 matrix_mul_2 (int n)
19 {
20   for (int i = 0; i < n; i++)
21     {
22       for (int j = 0; j < n; j++)
23 	{
24 	  for (int k = 0; k < n; k++)
25 	    d[i][j] = d[i][j] + a[i][k]*b[k][j];
26 
27 	  asm volatile ("" ::: "memory");
28 	}
29       asm volatile ("" ::: "memory");
30     }
31 }
32 
33 extern void abort ();
34 
35 static void __attribute__((noinline))
init(int i)36 init (int i)
37 {
38   for (int j = 0; j < M; j++)
39     {
40       a[i][j] = i;
41       b[i][j] = j;
42       c[i][j] = 0;
43       d[i][j] = 0;
44     }
45 }
46 
47 static int __attribute__((noinline))
check(int i)48 check (int i)
49 {
50   for (int j = 0; j < M; j++)
51     if (c[i][j] != d[i][j])
52       return 0;
53 
54   return 1;
55 }
56 
main(void)57 int main (void)
58 {
59   for (int i = 0; i < M; ++i)
60     init (i);
61 
62   matrix_mul_1 (M);
63   matrix_mul_2 (M);
64 
65   for (int i = 0; i < M; ++i)
66     if (!check (i))
67       abort ();
68 
69   return 0;
70 }
71 
72 /* { dg-final { scan-tree-dump-times "Loop_pair<outer:., inner:.> is interchanged" 2 "linterchange" } } */
73