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