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