Fortran: Fix PR 47485.
[gcc.git] / gcc / testsuite / g++.dg / goacc / template.C
blob995b9baa77b8ac0748ad312f10b027649db97f01
1 /* { dg-additional-options "-fdump-tree-oaccloops" } */
3 #pragma acc routine nohost
4 template <typename T> T
5 accDouble(int val)
7   return val * 2;
10 template<typename T, int I> T
11 oacc_parallel_copy (T a)
13   T b = 0;
14   char w = 1;
15   int x = 2;
16   float y = 3;
17   double z = 4;
19 #pragma acc parallel num_gangs (a) num_workers (a) vector_length (a) default (none) copyout (b) copyin (a)
20 #pragma acc loop gang worker vector
21   for (int i = 0; i < 1; i++)
22     b = a;
24 #pragma acc parallel num_gangs (a) copy (w, x, y, z)
25 #pragma acc loop
26   for (int i = 0; i < 1; i++)
27     {
28       w = accDouble<char>(w);
29       x = accDouble<int>(x);
30       y = accDouble<float>(y);
31       z = accDouble<double>(z);
32     }
34 #pragma acc parallel num_gangs (a) if (1)
35   {
36 #pragma acc loop independent collapse (2)
37     for (int i = 0; i < a; i++)
38       for (int j = 0; j < 5; j++)
39         b = a;
41 #pragma acc loop auto tile (I, 3)
42     for (int i = 0; i < a; i++)
43       for (int j = 0; j < 5; j++)
44         b = a;
46 #pragma acc loop seq
47     for (int i = 0; i < a; i++)
48       b = a;
49   }
51   T c;
53 #pragma acc parallel num_workers (10)
54 #pragma acc loop worker
55   for (int i = 0; i < 1; i++)
56     {
57 #pragma acc atomic capture
58       c = b++;
60 #pragma acc atomic update
61       c++;
63 #pragma acc atomic read
64       b = a;
66 #pragma acc atomic write
67       b = a;
68     }
70 #pragma acc parallel reduction (+:c)
71   c = 1;
73 #pragma acc data if (1) copy (b)
74   {
75 #pragma acc parallel
76     {
77       b = a;
78     }
79   }
81 #pragma acc enter data copyin (b)
82 #pragma acc parallel present (b)
83   {
84     b = a;
85   }
87 #pragma acc update host (b)
88 #pragma acc update self (b)
89 #pragma acc update device (b)
90 #pragma acc exit data delete (b)
91 #pragma acc exit data finalize copyout (b)
92 #pragma acc exit data delete (b) finalize
94   return b;
97 template<typename T> T
98 oacc_kernels_copy (T a)
100   T b = 0;
101   T c = 0;
102   char w = 1;
103   int x = 2;
104   float y = 3;
105   double z = 4;
107 #pragma acc kernels num_gangs (a) num_workers (a) vector_length (a) default (none) copyout (b) copyin (a)
108   for (int i = 0; i < 1; i++)
109     b = a;
111 #pragma acc kernels copy (w, x, y, z)
112   {
113     w = accDouble<char>(w);
114     x = accDouble<int>(x);
115     y = accDouble<float>(y);
116     z = accDouble<double>(z);
117   }
119 #pragma acc kernels copyout (b) copyin (a)
120   b = a;
122 #pragma acc kernels loop reduction (+:c)
123   for (int i = 0; i < 10; i++)
124     c = 1;
126 #pragma acc data if (1) copy (b)
127   {
128     #pragma acc kernels
129     {
130       b = a;
131     }
132   }
134 #pragma acc enter data copyin (b)
135 #pragma acc kernels present (b)
136   {
137     b = a;
138   }
140 #pragma acc update host (b)
141 #pragma acc update self (b)
142 #pragma acc update device (b)
143 #pragma acc exit data delete (b)
144 #pragma acc exit data finalize copyout (b)
145 #pragma acc exit data delete (b) finalize
147   return b;
150 template<typename T, int I> T
151 oacc_serial_copy (T a)
153   T b = 0;
154   char w = 1;
155   int x = 2;
156   float y = 3;
157   double z = 4;
159 #pragma acc serial default (none) copyout (b) copyin (a)
160 #pragma acc loop gang worker vector
161   for (int i = 0; i < 1; i++)
162     b = a;
164 #pragma acc serial copy (w, x, y, z)
165 #pragma acc loop
166   for (int i = 0; i < 1; i++)
167     {
168       w = accDouble<char>(w);
169       x = accDouble<int>(x);
170       y = accDouble<float>(y);
171       z = accDouble<double>(z);
172     }
174 #pragma acc serial if (1)
175   {
176 #pragma acc loop independent collapse (2)
177     for (int i = 0; i < a; i++)
178       for (int j = 0; j < 5; j++)
179         b = a;
181 #pragma acc loop auto tile (I, 3)
182     for (int i = 0; i < a; i++)
183       for (int j = 0; j < 5; j++)
184         b = a;
186 #pragma acc loop seq
187     for (int i = 0; i < a; i++)
188       b = a;
189   }
191   T c;
193 #pragma acc serial
194 #pragma acc loop worker
195   for (int i = 0; i < 1; i++)
196     {
197 #pragma acc atomic capture
198       c = b++;
200 #pragma atomic update
201       c++;
203 #pragma acc atomic read
204       b = a;
206 #pragma acc atomic write
207       b = a;
208     }
210 #pragma acc serial reduction (+:c)
211   c = 1;
213 #pragma acc data if (1) copy (b)
214   {
215 #pragma acc serial
216     {
217       b = a;
218     }
219   }
221 #pragma acc enter data copyin (b)
222 #pragma acc serial present (b)
223   {
224     b = a;
225   }
227 #pragma acc update host (b)
228 #pragma acc update self (b)
229 #pragma acc update device (b)
230 #pragma acc exit data delete (b)
231 #pragma acc exit data finalize copyout (b)
232 #pragma acc exit data delete (b) finalize
234   return b;
238 main ()
240   int b = oacc_parallel_copy<int, 4> (5);
241   int c = oacc_kernels_copy<int> (5);
242   int d = oacc_serial_copy<int, 6> (5);
244   return b + c + d;
247 /* { dg-final { scan-tree-dump-times {(?n)^OpenACC routine '[^']+' has 'nohost' clause\.$} 4 oaccloops } }
248    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'T accDouble\(int\) \[with T = char\]' has 'nohost' clause\.$} 1 oaccloops { target { ! offloading_enabled } } } }
249    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'accDouble<char>\(int\)char' has 'nohost' clause\.$} 1 oaccloops { target offloading_enabled } } }
250    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'T accDouble\(int\) \[with T = int\]' has 'nohost' clause\.$} 1 oaccloops { target { ! offloading_enabled } } } }
251    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'accDouble<int>\(int\)int' has 'nohost' clause\.$} 1 oaccloops { target offloading_enabled } } }
252    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'T accDouble\(int\) \[with T = float\]' has 'nohost' clause\.$} 1 oaccloops { target { ! offloading_enabled } } } }
253    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'accDouble<float>\(int\)float' has 'nohost' clause\.$} 1 oaccloops { target offloading_enabled } } }
254    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'T accDouble\(int\) \[with T = double\]' has 'nohost' clause\.$} 1 oaccloops { target { ! offloading_enabled } } } }
255    { dg-final { scan-tree-dump-times {(?n)^OpenACC routine 'accDouble<double>\(int\)double' has 'nohost' clause\.$} 1 oaccloops { target offloading_enabled } } }
256    TODO See PR101551 for 'offloading_enabled' differences.  */