Clang Project

clang_source_code/test/OpenMP/target_parallel_for_is_device_ptr_ast_print.cpp
1// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4
5// RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 -ast-print %s | FileCheck %s
6// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8// expected-no-diagnostics
9
10#ifndef HEADER
11#define HEADER
12
13void foo() {}
14
15struct ST {
16  int *a;
17};
18typedef int arr[10];
19typedef ST STarr[10];
20struct SA {
21  const int da[5] = { 0 };
22  ST g[10];
23  STarr &rg = g;
24  int i;
25  int &j = i;
26  int *k = &j;
27  int *&z = k;
28  int aa[10];
29  arr &raa = aa;
30  void func(int arg) {
31#pragma omp target parallel for is_device_ptr(k)
32    for (int i=0; i<100; i++) foo();
33
34#pragma omp target parallel for is_device_ptr(z)
35    for (int i=0; i<100; i++) foo();
36
37#pragma omp target parallel for is_device_ptr(aa) // OK
38    for (int i=0; i<100; i++) foo();
39
40#pragma omp target parallel for is_device_ptr(raa) // OK
41    for (int i=0; i<100; i++) foo();
42
43#pragma omp target parallel for is_device_ptr(g) // OK
44    for (int i=0; i<100; i++) foo();
45
46#pragma omp target parallel for is_device_ptr(rg) // OK
47    for (int i=0; i<100; i++) foo();
48
49#pragma omp target parallel for is_device_ptr(da) // OK
50    for (int i=0; i<100; i++) foo();
51
52    return;
53  }
54};
55// CHECK: struct SA
56// CHECK-NEXT: const int da[5] = {0};
57// CHECK-NEXT: ST g[10];
58// CHECK-NEXT: STarr &rg = this->g;
59// CHECK-NEXT: int i;
60// CHECK-NEXT: int &j = this->i;
61// CHECK-NEXT: int *k = &this->j;
62// CHECK-NEXT: int *&z = this->k;
63// CHECK-NEXT: int aa[10];
64// CHECK-NEXT: arr &raa = this->aa;
65// CHECK-NEXT: func(
66// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->k){{$}}
67// CHECK-NEXT: for (int i = 0; i < 100; i++)
68// CHECK-NEXT: foo();
69// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->z)
70// CHECK-NEXT: for (int i = 0; i < 100; i++)
71// CHECK-NEXT: foo();
72// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->aa)
73// CHECK-NEXT: for (int i = 0; i < 100; i++)
74// CHECK-NEXT: foo();
75// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->raa)
76// CHECK-NEXT: for (int i = 0; i < 100; i++)
77// CHECK-NEXT: foo();
78// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->g)
79// CHECK-NEXT: for (int i = 0; i < 100; i++)
80// CHECK-NEXT: foo();
81// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->rg)
82// CHECK-NEXT: for (int i = 0; i < 100; i++)
83// CHECK-NEXT: foo();
84// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(this->da)
85// CHECK-NEXT: for (int i = 0; i < 100; i++)
86// CHECK-NEXT: foo();
87
88struct SB {
89  unsigned A;
90  unsigned B;
91  float Arr[100];
92  float *Ptr;
93  float *foo() {
94    return &Arr[0];
95  }
96};
97
98struct SC {
99  unsigned A : 2;
100  unsigned B : 3;
101  unsigned C;
102  unsigned D;
103  float Arr[100];
104  SB S;
105  SB ArrS[100];
106  SB *PtrS;
107  SB *&RPtrS;
108  float *Ptr;
109
110  SC(SB *&_RPtrS) : RPtrS(_RPtrS) {}
111};
112
113union SD {
114  unsigned A;
115  float B;
116};
117
118struct S1;
119extern S1 a;
120class S2 {
121  mutable int a;
122public:
123  S2():a(0) { }
124  S2(S2 &s2):a(s2.a) { }
125  static float S2s;
126  static const float S2sc;
127};
128const float S2::S2sc = 0;
129const S2 b;
130const S2 ba[5];
131class S3 {
132  int a;
133public:
134  S3():a(0) { }
135  S3(S3 &s3):a(s3.a) { }
136};
137const S3 c;
138const S3 ca[5];
139extern const int f;
140class S4 {
141  int a;
142  S4();
143  S4(const S4 &s4);
144public:
145  S4(int v):a(v) { }
146};
147class S5 {
148  int a;
149  S5():a(0) {}
150  S5(const S5 &s5):a(s5.a) { }
151public:
152  S5(int v):a(v) { }
153};
154
155S3 h;
156#pragma omp threadprivate(h)
157
158typedef struct {
159  int a;
160} S6;
161
162template <typename T>
163T tmain(T argc) {
164  const T da[5] = { 0 };
165  S6 h[10];
166  auto &rh = h;
167  T i;
168  T &j = i;
169  T *k = &j;
170  T *&z = k;
171  T aa[10];
172  auto &raa = aa;
173#pragma omp target parallel for is_device_ptr(k)
174  for (int i=0; i<100; i++) foo();
175#pragma omp target parallel for is_device_ptr(z)
176  for (int i=0; i<100; i++) foo();
177#pragma omp target parallel for is_device_ptr(aa)
178  for (int i=0; i<100; i++) foo();
179#pragma omp target parallel for is_device_ptr(raa)
180  for (int i=0; i<100; i++) foo();
181#pragma omp target parallel for is_device_ptr(h)
182  for (int i=0; i<100; i++) foo();
183#pragma omp target parallel for is_device_ptr(rh)
184  for (int i=0; i<100; i++) foo();
185#pragma omp target parallel for is_device_ptr(da)
186  for (int i=0; i<100; i++) foo();
187  return 0;
188}
189
190// CHECK: template<> int tmain<int>(int argc) {
191// CHECK-NEXT: const int da[5] = {0};
192// CHECK-NEXT: S6 h[10];
193// CHECK-NEXT: auto &rh = h;
194// CHECK-NEXT: int i;
195// CHECK-NEXT: int &j = i;
196// CHECK-NEXT: int *k = &j;
197// CHECK-NEXT: int *&z = k;
198// CHECK-NEXT: int aa[10];
199// CHECK-NEXT: auto &raa = aa;
200// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(k)
201// CHECK-NEXT: for (int i = 0; i < 100; i++)
202// CHECK-NEXT: foo();
203// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(z)
204// CHECK-NEXT: for (int i = 0; i < 100; i++)
205// CHECK-NEXT: foo();
206// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(aa)
207// CHECK-NEXT: for (int i = 0; i < 100; i++)
208// CHECK-NEXT: foo();
209// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(raa)
210// CHECK-NEXT: for (int i = 0; i < 100; i++)
211// CHECK-NEXT: foo();
212// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(h)
213// CHECK-NEXT: for (int i = 0; i < 100; i++)
214// CHECK-NEXT: foo();
215// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(rh)
216// CHECK-NEXT: for (int i = 0; i < 100; i++)
217// CHECK-NEXT: foo();
218// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(da)
219// CHECK-NEXT: for (int i = 0; i < 100; i++)
220// CHECK-NEXT: foo();
221
222// CHECK: template<> int *tmain<int *>(int *argc) {
223// CHECK-NEXT: int *const da[5] = {0};
224// CHECK-NEXT: S6 h[10];
225// CHECK-NEXT: auto &rh = h;
226// CHECK-NEXT: int *i;
227// CHECK-NEXT: int *&j = i;
228// CHECK-NEXT: int **k = &j;
229// CHECK-NEXT: int **&z = k;
230// CHECK-NEXT: int *aa[10];
231// CHECK-NEXT: auto &raa = aa;
232// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(k)
233// CHECK-NEXT: for (int i = 0; i < 100; i++)
234// CHECK-NEXT: foo();
235// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(z)
236// CHECK-NEXT: for (int i = 0; i < 100; i++)
237// CHECK-NEXT: foo();
238// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(aa)
239// CHECK-NEXT: for (int i = 0; i < 100; i++)
240// CHECK-NEXT: foo();
241// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(raa)
242// CHECK-NEXT: for (int i = 0; i < 100; i++)
243// CHECK-NEXT: foo();
244// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(h)
245// CHECK-NEXT: for (int i = 0; i < 100; i++)
246// CHECK-NEXT: foo();
247// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(rh)
248// CHECK-NEXT: for (int i = 0; i < 100; i++)
249// CHECK-NEXT: foo();
250// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(da)
251// CHECK-NEXT: for (int i = 0; i < 100; i++)
252// CHECK-NEXT: foo();
253
254// CHECK-LABEL: int main(int argc, char **argv) {
255int main(int argc, char **argv) {
256  const int da[5] = { 0 };
257  S6 h[10];
258  auto &rh = h;
259  int i;
260  int &j = i;
261  int *k = &j;
262  int *&z = k;
263  int aa[10];
264  auto &raa = aa;
265// CHECK-NEXT: const int da[5] = {0};
266// CHECK-NEXT: S6 h[10];
267// CHECK-NEXT: auto &rh = h;
268// CHECK-NEXT: int i;
269// CHECK-NEXT: int &j = i;
270// CHECK-NEXT: int *k = &j;
271// CHECK-NEXT: int *&z = k;
272// CHECK-NEXT: int aa[10];
273// CHECK-NEXT: auto &raa = aa;
274#pragma omp target parallel for is_device_ptr(k)
275  for (int i=0; i<100; i++) foo();
276// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(k)
277// CHECK-NEXT: for (int i = 0; i < 100; i++)
278// CHECK-NEXT: foo();
279
280#pragma omp target parallel for is_device_ptr(z)
281  for (int i=0; i<100; i++) foo();
282// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(z)
283// CHECK-NEXT: for (int i = 0; i < 100; i++)
284// CHECK-NEXT: foo();
285
286#pragma omp target parallel for is_device_ptr(aa)
287  for (int i=0; i<100; i++) foo();
288// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(aa)
289// CHECK-NEXT: for (int i = 0; i < 100; i++)
290// CHECK-NEXT: foo();
291
292#pragma omp target parallel for is_device_ptr(raa)
293  for (int i=0; i<100; i++) foo();
294// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(raa)
295// CHECK-NEXT: for (int i = 0; i < 100; i++)
296// CHECK-NEXT: foo();
297
298#pragma omp target parallel for is_device_ptr(h)
299  for (int i=0; i<100; i++) foo();
300// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(h)
301// CHECK-NEXT: for (int i = 0; i < 100; i++)
302// CHECK-NEXT: foo();
303
304#pragma omp target parallel for is_device_ptr(rh)
305  for (int i=0; i<100; i++) foo();
306// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(rh)
307// CHECK-NEXT: for (int i = 0; i < 100; i++)
308// CHECK-NEXT: foo();
309
310#pragma omp target parallel for is_device_ptr(da)
311  for (int i=0; i<100; i++) foo();
312// CHECK-NEXT: #pragma omp target parallel for is_device_ptr(da)
313// CHECK-NEXT: for (int i = 0; i < 100; i++)
314// CHECK-NEXT: foo();
315  return tmain<int>(argc) + *tmain<int *>(&argc);
316}
317
318
319#endif
320