Clang Project

clang_source_code/test/OpenMP/target_parallel_for_ast_print.cpp
1// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s -Wno-openmp-target | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-target
3// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-target | FileCheck %s
4
5// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s -Wno-openmp-target | FileCheck %s
6// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-target
7// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-target | FileCheck %s
8// expected-no-diagnostics
9
10#ifndef HEADER
11#define HEADER
12
13void foo() {}
14
15struct S {
16  S(): a(0) {}
17  S(int v) : a(v) {}
18  int a;
19  typedef int type;
20};
21
22template <typename T>
23class S7 : public T {
24protected:
25  T a;
26  S7() : a(0) {}
27
28public:
29  S7(typename T::type v) : a(v) {
30#pragma omp target parallel for private(a) private(this->a) private(T::a)
31    for (int k = 0; k < a.a; ++k)
32      ++this->a.a;
33  }
34  S7 &operator=(S7 &s) {
35#pragma omp target parallel for private(a) private(this->a)
36    for (int k = 0; k < s.a.a; ++k)
37      ++s.a.a;
38    return *this;
39  }
40};
41
42// CHECK: #pragma omp target parallel for private(this->a) private(this->a) private(T::a){{$}}
43// CHECK: #pragma omp target parallel for private(this->a) private(this->a)
44// CHECK: #pragma omp target parallel for private(this->a) private(this->a) private(this->S::a)
45
46class S8 : public S7<S> {
47  S8() {}
48
49public:
50  S8(int v) : S7<S>(v){
51#pragma omp target parallel for private(a) private(this->a) private(S7<S>::a)
52    for (int k = 0; k < a.a; ++k)
53      ++this->a.a;
54  }
55  S8 &operator=(S8 &s) {
56#pragma omp target parallel for private(a) private(this->a)
57    for (int k = 0; k < s.a.a; ++k)
58      ++s.a.a;
59    return *this;
60  }
61};
62
63// CHECK: #pragma omp target parallel for private(this->a) private(this->a) private(this->S7<S>::a)
64// CHECK: #pragma omp target parallel for private(this->a) private(this->a)
65
66template <class T, int N>
67T tmain(T argc, T *argv) {
68  T b = argc, c, d, e, f, h;
69  T arr[N][10], arr1[N];
70  T i, j;
71  T s;
72  static T a;
73// CHECK: static T a;
74  static T g;
75#pragma omp threadprivate(g)
76#pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a)
77  // CHECK: #pragma omp target parallel for schedule(dynamic) default(none) linear(a) allocate(a)
78  for (int i = 0; i < 2; ++i)
79    a = 2;
80// CHECK-NEXT: for (int i = 0; i < 2; ++i)
81// CHECK-NEXT: a = 2;
82#pragma omp target parallel for allocate(b) private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) schedule(static, N) ordered(N) if (parallel :argc) num_threads(N) default(shared) shared(e) reduction(+ : h)
83  for (int i = 0; i < 2; ++i)
84    for (int j = 0; j < 2; ++j)
85      for (int j = 0; j < 2; ++j)
86        for (int j = 0; j < 2; ++j)
87          for (int j = 0; j < 2; ++j)
88  for (int i = 0; i < 2; ++i)
89    for (int j = 0; j < 2; ++j)
90      for (int j = 0; j < 2; ++j)
91        for (int j = 0; j < 2; ++j)
92          for (int j = 0; j < 2; ++j)
93            foo();
94  // CHECK-NEXT: #pragma omp target parallel for allocate(b) private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) schedule(static, N) ordered(N) if(parallel: argc) num_threads(N) default(shared) shared(e) reduction(+: h)
95  // CHECK-NEXT: for (int i = 0; i < 2; ++i)
96  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
97  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
98  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
99  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
100  // CHECK-NEXT: for (int i = 0; i < 2; ++i)
101  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
102  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
103  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
104  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
105  // CHECK-NEXT: foo();
106#pragma omp target parallel for default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(N) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:N][0:10])
107  for (int i = 0; i < 2; ++i) {}
108// CHECK-NEXT: #pragma omp target parallel for default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(N) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:N][0:10])
109  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
110  // CHECK-NEXT: }
111#pragma omp target parallel for if (N) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:N][:argc]) reduction(&& : h)
112// CHECK-NEXT: #pragma omp target parallel for if(N) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:N][:argc]) reduction(&&: h)
113  for (int i = 0; i < 2; ++i) {}
114  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
115  // CHECK-NEXT: }
116#pragma omp target parallel for if (target:argc > 0)
117// CHECK-NEXT: #pragma omp target parallel for if(target: argc > 0)
118  for (int i = 0; i < 2; ++i) {}
119  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
120  // CHECK-NEXT: }
121#pragma omp target parallel for if (parallel:argc > 0)
122// CHECK-NEXT: #pragma omp target parallel for if(parallel: argc > 0)
123  for (int i = 0; i < 2; ++i) {}
124  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
125  // CHECK-NEXT: }
126#pragma omp target parallel for if (N)
127// CHECK-NEXT: #pragma omp target parallel for if(N)
128  for (int i = 0; i < 2; ++i) {}
129  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
130  // CHECK-NEXT: }
131#pragma omp target parallel for map(i)
132// CHECK-NEXT: #pragma omp target parallel for map(tofrom: i)
133  for (int i = 0; i < 2; ++i) {}
134  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
135  // CHECK-NEXT: }
136#pragma omp target parallel for map(arr1[0:10], i)
137// CHECK-NEXT: #pragma omp target parallel for map(tofrom: arr1[0:10],i)
138  for (int i = 0; i < 2; ++i) {}
139  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
140  // CHECK-NEXT: }
141#pragma omp target parallel for map(to: i) map(from: j)
142// CHECK-NEXT: #pragma omp target parallel for map(to: i) map(from: j)
143  for (int i = 0; i < 2; ++i) {}
144  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
145  // CHECK-NEXT: }
146#pragma omp target parallel for map(always,alloc: i)
147// CHECK-NEXT: #pragma omp target parallel for map(always,alloc: i)
148  for (int i = 0; i < 2; ++i) {}
149  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
150  // CHECK-NEXT: }
151#pragma omp target parallel for nowait
152// CHECK-NEXT: #pragma omp target parallel for nowait
153  for (int i = 0; i < 2; ++i) {}
154  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
155  // CHECK-NEXT: }
156#pragma omp target parallel for depend(in : argc, arr[i:argc], arr1[:])
157// CHECK-NEXT: #pragma omp target parallel for depend(in : argc,arr[i:argc],arr1[:])
158  for (int i = 0; i < 2; ++i) {}
159  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
160  // CHECK-NEXT: }
161#pragma omp target parallel for defaultmap(tofrom: scalar)
162// CHECK-NEXT: #pragma omp target parallel for defaultmap(tofrom: scalar)
163  for (int i = 0; i < 2; ++i) {}
164  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
165  // CHECK-NEXT: }
166
167  return T();
168}
169
170int main(int argc, char **argv) {
171  int b = argc, c, d, e, f, h;
172  int arr[5][10], arr1[5];
173  int i, j;
174  int s;
175  static int a;
176// CHECK: static int a;
177  static float g;
178#pragma omp threadprivate(g)
179#pragma omp target parallel for schedule(guided, argc) default(none) linear(a)
180  // CHECK: #pragma omp target parallel for schedule(guided, argc) default(none) linear(a)
181  for (int i = 0; i < 2; ++i)
182    a = 2;
183// CHECK-NEXT: for (int i = 0; i < 2; ++i)
184// CHECK-NEXT: a = 2;
185#pragma omp target parallel for private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) schedule(auto) ordered if (target: argc) num_threads(a) default(shared) shared(e) reduction(+ : h) linear(a:-5)
186  for (int i = 0; i < 10; ++i)
187    for (int j = 0; j < 10; ++j)
188      foo();
189  // CHECK-NEXT: #pragma omp target parallel for private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) schedule(auto) ordered if(target: argc) num_threads(a) default(shared) shared(e) reduction(+: h) linear(a: -5)
190 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
191  // CHECK-NEXT: for (int j = 0; j < 10; ++j)
192  // CHECK-NEXT: foo();
193#pragma omp target parallel for default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(5) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:5][0:10])
194  for (int i = 0; i < 2; ++i) {}
195// CHECK-NEXT: #pragma omp target parallel for default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])
196  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
197  // CHECK-NEXT: }
198#pragma omp target parallel for if (5) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:5][:argc]) reduction(&& : h)
199// CHECK-NEXT: #pragma omp target parallel for if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: h)
200  for (int i = 0; i < 2; ++i) {}
201  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
202  // CHECK-NEXT: }
203#pragma omp target parallel for if (target:argc > 0)
204// CHECK-NEXT: #pragma omp target parallel for if(target: argc > 0)
205  for (int i = 0; i < 2; ++i) {}
206  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
207  // CHECK-NEXT: }
208#pragma omp target parallel for if (parallel:argc > 0)
209// CHECK-NEXT: #pragma omp target parallel for if(parallel: argc > 0)
210  for (int i = 0; i < 2; ++i) {}
211  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
212  // CHECK-NEXT: }
213#pragma omp target parallel for if (5)
214// CHECK-NEXT: #pragma omp target parallel for if(5)
215  for (int i = 0; i < 2; ++i) {}
216  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
217  // CHECK-NEXT: }
218#pragma omp target parallel for map(i)
219// CHECK-NEXT: #pragma omp target parallel for map(tofrom: i)
220  for (int i = 0; i < 2; ++i) {}
221  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
222  // CHECK-NEXT: }
223#pragma omp target parallel for map(arr1[0:10], i)
224// CHECK-NEXT: #pragma omp target parallel for map(tofrom: arr1[0:10],i)
225  for (int i = 0; i < 2; ++i) {}
226  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
227  // CHECK-NEXT: }
228#pragma omp target parallel for map(to: i) map(from: j)
229// CHECK-NEXT: #pragma omp target parallel for map(to: i) map(from: j)
230  for (int i = 0; i < 2; ++i) {}
231  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
232  // CHECK-NEXT: }
233#pragma omp target parallel for map(always,alloc: i)
234// CHECK-NEXT: #pragma omp target parallel for map(always,alloc: i)
235  for (int i = 0; i < 2; ++i) {}
236  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
237  // CHECK-NEXT: }
238#pragma omp target parallel for nowait
239// CHECK-NEXT: #pragma omp target parallel for nowait
240  for (int i = 0; i < 2; ++i) {}
241  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
242  // CHECK-NEXT: }
243#pragma omp target parallel for depend(in : argc, arr[i:argc], arr1[:])
244// CHECK-NEXT: #pragma omp target parallel for depend(in : argc,arr[i:argc],arr1[:])
245  for (int i = 0; i < 2; ++i) {}
246  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
247  // CHECK-NEXT: }
248#pragma omp target parallel for defaultmap(tofrom: scalar)
249// CHECK-NEXT: #pragma omp target parallel for defaultmap(tofrom: scalar)
250  for (int i = 0; i < 2; ++i) {}
251  // CHECK-NEXT: for (int i = 0; i < 2; ++i) {
252  // CHECK-NEXT: }
253  return (tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]));
254}
255
256#endif
257