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)9matrix_mul_1 (int n) 10 { 11 for (int k = 0; k < n; k++) 12 for (int j = 0; j < n; j++) 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)18matrix_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)36init (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)48check (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)57int 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