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