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