1 /* PR tree-optimization/83337 */
2 /* { dg-do run { target int32plus } } */
3 /* { dg-options "-O2 -floop-interchange -fdump-tree-linterchange-details" } */
4 /* { dg-skip-if "too big data segment" { visium-*-* } } */
5 
6 /* Copied from graphite/interchange-5.c */
7 
8 #define DEBUG 0
9 #if DEBUG
10 #include <stdio.h>
11 #endif
12 
13 #define N 100
14 #define M 1111
15 struct S { int a : 3; int b : 17; int c : 12; };
16 struct S A[N][M];
17 
18 static int __attribute__((noinline))
foo(void)19 foo (void)
20 {
21   int i, j;
22 
23   for( i = 0; i < M; i++)
24     for( j = 0; j < N; j++)
25       A[j][i].b = 5 * A[j][i].b;
26 
27   return A[0][0].b + A[N-1][M-1].b;
28 }
29 
30 extern void abort ();
31 
32 static void __attribute__((noinline))
init(int i)33 init (int i)
34 {
35   int j;
36 
37   for (j = 0; j < M; j++)
38     A[i][j].b = 2;
39 }
40 
41 int
main(void)42 main (void)
43 {
44   int i, j, res;
45 
46   for (i = 0; i < N; i++)
47     init (i);
48 
49   res = foo ();
50 
51 #if DEBUG
52   fprintf (stderr, "res = %d \n", res);
53 #endif
54 
55   if (res != 20)
56     abort ();
57 
58   return 0;
59 }
60 
61 /* { dg-final { scan-tree-dump-times "Loop_pair<outer:., inner:.> is interchanged" 1 "linterchange"} } */
62