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