1 /* Exercise nested function decomposition, gcc/tree-nested.c.  */
2 /* See gcc/testsuite/gfortran.dg/goacc/nested-function-1.f90 for the Fortran
3    version.  */
4 
main()5 int main ()
6 {
7 #define N 100
8   int nonlocal_arg;
9   int nonlocal_a[N];
10   int nonlocal_i;
11   int nonlocal_j;
12 
13   for (int i = 0; i < N; ++i)
14     nonlocal_a[i] = 5;
15   nonlocal_arg = 5;
16 
17   void local ()
18   {
19     int local_i;
20     int local_arg;
21     int local_a[N];
22     int local_j;
23 
24     for (int i = 0; i < N; ++i)
25       local_a[i] = 5;
26     local_arg = 5;
27 
28 #pragma acc kernels loop \
29   gang(num:local_arg) worker(local_arg) vector(local_arg) \
30   wait async(local_arg)
31     for (local_i = 0; local_i < N; ++local_i)
32       {
33 #pragma acc cache (local_a[local_i:5])
34 	local_a[local_i] = 100;
35 #pragma acc loop seq tile(*)
36 	for (local_j = 0; local_j < N; ++local_j)
37 	  ;
38 #pragma acc loop auto independent tile(1)
39 	for (local_j = 0; local_j < N; ++local_j)
40 	  ;
41       }
42 
43 #pragma acc kernels loop \
44   gang(static:local_arg) worker(local_arg) vector(local_arg) \
45   wait(local_arg, local_arg + 1, local_arg + 2) async
46     for (local_i = 0; local_i < N; ++local_i)
47       {
48 #pragma acc cache (local_a[local_i:4])
49 	local_a[local_i] = 100;
50 #pragma acc loop seq tile(1)
51 	for (local_j = 0; local_j < N; ++local_j)
52 	  ;
53 #pragma acc loop auto independent tile(*)
54 	for (local_j = 0; local_j < N; ++local_j)
55 	  ;
56       }
57   }
58 
59   void nonlocal ()
60   {
61     for (int i = 0; i < N; ++i)
62       nonlocal_a[i] = 5;
63     nonlocal_arg = 5;
64 
65 #pragma acc kernels loop \
66   gang(num:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) \
67   wait async(nonlocal_arg)
68     for (nonlocal_i = 0; nonlocal_i < N; ++nonlocal_i)
69       {
70 #pragma acc cache (nonlocal_a[nonlocal_i:3])
71 	nonlocal_a[nonlocal_i] = 100;
72 #pragma acc loop seq tile(2)
73 	for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
74 	  ;
75 #pragma acc loop auto independent tile(3)
76 	for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
77 	  ;
78       }
79 
80 #pragma acc kernels loop \
81   gang(static:nonlocal_arg) worker(nonlocal_arg) vector(nonlocal_arg) \
82   wait(nonlocal_arg, nonlocal_arg + 1, nonlocal_arg + 2) async
83     for (nonlocal_i = 0; nonlocal_i < N; ++nonlocal_i)
84       {
85 #pragma acc cache (nonlocal_a[nonlocal_i:2])
86 	nonlocal_a[nonlocal_i] = 100;
87 #pragma acc loop seq tile(*)
88 	for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
89 	  ;
90 #pragma acc loop auto independent tile(*)
91 	for (nonlocal_j = 0; nonlocal_j < N; ++nonlocal_j)
92 	  ;
93       }
94   }
95 
96   local ();
97   nonlocal ();
98 
99   return 0;
100 }
101