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