1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -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 -ast-print %s -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50 5 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping -DOMP5 6 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50 7 8 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s -Wno-openmp-mapping | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45 9 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping 10 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -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 -ast-print %s -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50 12 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping -DOMP5 13 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping -DOMP5 | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50 14 // expected-no-diagnostics 15 16 #ifndef HEADER 17 #define HEADER 18 19 void foo() {} 20 21 struct S { 22 S(): a(0) {} 23 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; 32 S7() : a(0) {} 33 34 public: 35 S7(typename T::type v) : a(v) { 36 #pragma omp target parallel for simd private(a) private(this->a) private(T::a) 37 for (int k = 0; k < a.a; ++k) 38 ++this->a.a; 39 } 40 S7 &operator=(S7 &s) { 41 #pragma omp target parallel for simd private(a) private(this->a) 42 for (int k = 0; k < s.a.a; ++k) 43 ++s.a.a; 44 return *this; 45 } 46 }; 47 48 // CHECK: #pragma omp target parallel for simd private(this->a) private(this->a) private(T::a){{$}} 49 // CHECK: #pragma omp target parallel for simd private(this->a) private(this->a) 50 // CHECK: #pragma omp target parallel for simd private(this->a) private(this->a) private(this->S::a) 51 52 class S8 : public S7<S> { 53 S8() {} 54 55 public: 56 S8(int v) : S7<S>(v){ 57 #pragma omp target parallel for simd private(a) private(this->a) private(S7<S>::a) 58 for (int k = 0; k < a.a; ++k) 59 ++this->a.a; 60 } 61 S8 &operator=(S8 &s) { 62 #pragma omp target parallel for simd private(a) private(this->a) 63 for (int k = 0; k < s.a.a; ++k) 64 ++s.a.a; 65 return *this; 66 } 67 }; 68 69 // CHECK: #pragma omp target parallel for simd private(this->a) private(this->a) private(this->S7<S>::a) 70 // CHECK: #pragma omp target parallel for simd private(this->a) private(this->a) 71 72 template <class T, int N> 73 T tmain(T argc, T *argv) { 74 T b = argc, c, d, e, f, h; 75 T arr[N][10], arr1[N]; 76 T i, j; 77 T s; 78 static T a; 79 // CHECK: static T a; 80 static T g; 81 const T clen = 5; 82 // CHECK: T clen = 5; 83 #pragma omp threadprivate(g) 84 #pragma omp target parallel for simd schedule(dynamic) default(none) linear(a) allocate(a) 85 // CHECK: #pragma omp target parallel for simd schedule(dynamic) default(none) linear(a) allocate(a) 86 for (T i = 0; i < 2; ++i) 87 a = 2; 88 // CHECK-NEXT: for (T i = 0; i < 2; ++i) 89 // CHECK-NEXT: a = 2; 90 #pragma omp target parallel for simd allocate(d) private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) schedule(static, N) ordered if (parallel :argc) num_threads(N) default(shared) shared(e) reduction(+ : h) 91 for (int i = 0; i < 2; ++i) 92 for (int j = 0; j < 2; ++j) 93 for (int j = 0; j < 2; ++j) 94 for (int j = 0; j < 2; ++j) 95 for (int j = 0; j < 2; ++j) 96 foo(); 97 // CHECK-NEXT: #pragma omp target parallel for simd allocate(d) private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) schedule(static, N) ordered if(parallel: argc) num_threads(N) default(shared) shared(e) reduction(+: h) 98 // CHECK-NEXT: for (int i = 0; i < 2; ++i) 99 // CHECK-NEXT: for (int j = 0; j < 2; ++j) 100 // CHECK-NEXT: for (int j = 0; j < 2; ++j) 101 // CHECK-NEXT: for (int j = 0; j < 2; ++j) 102 // CHECK-NEXT: for (int j = 0; j < 2; ++j) 103 // CHECK-NEXT: foo(); 104 105 #pragma omp target parallel for simd default(none), private(argc,b) firstprivate(argv) shared (d) if(parallel:argc > 0) num_threads(N) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:N][0:10]) 106 for (T i = 0; i < 2; ++i) {} 107 // CHECK: #pragma omp target parallel for simd default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(N) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:N][0:10]) 108 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 109 // CHECK-NEXT: } 110 111 #pragma omp target parallel for simd if(N) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:N][:argc]) reduction(&& : h) 112 for (T i = 0; i < 2; ++i) {} 113 // CHECK: #pragma omp target parallel for simd if(N) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:N][:argc]) reduction(&&: h) 114 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 115 // CHECK-NEXT: } 116 117 #ifdef OMP5 118 #pragma omp target parallel for simd if(target:argc > 0) if (simd: argc) nontemporal(argc, c, d) order(concurrent) 119 #else 120 #pragma omp target parallel for simd if(target:argc > 0) 121 #endif // OMP5 122 for (T i = 0; i < 2; ++i) {} 123 // OMP45: #pragma omp target parallel for simd if(target: argc > 0) 124 // OMP50: #pragma omp target parallel for simd if(target: argc > 0) if(simd: argc) nontemporal(argc,c,d) order(concurrent) 125 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 126 // CHECK-NEXT: } 127 128 #pragma omp target parallel for simd if(parallel:argc > 0) 129 for (T i = 0; i < 2; ++i) {} 130 // CHECK: #pragma omp target parallel for simd if(parallel: argc > 0) 131 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 132 // CHECK-NEXT: } 133 134 #pragma omp target parallel for simd if(N) 135 for (T i = 0; i < 2; ++i) {} 136 // CHECK: #pragma omp target parallel for simd if(N) 137 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 138 // CHECK-NEXT: } 139 140 #pragma omp target parallel for simd map(i) 141 for (T i = 0; i < 2; ++i) {} 142 // CHECK: #pragma omp target parallel for simd map(tofrom: i) 143 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 144 // CHECK-NEXT: } 145 146 #pragma omp target parallel for simd map(arr1[0:10], i) 147 for (T i = 0; i < 2; ++i) {} 148 // CHECK: #pragma omp target parallel for simd map(tofrom: arr1[0:10],i) 149 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 150 // CHECK-NEXT: } 151 152 #pragma omp target parallel for simd map(to: i) map(from: j) 153 for (T i = 0; i < 2; ++i) {} 154 // CHECK: #pragma omp target parallel for simd map(to: i) map(from: j) 155 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 156 // CHECK-NEXT: } 157 158 #pragma omp target parallel for simd map(always,alloc: i) 159 for (T i = 0; i < 2; ++i) {} 160 // CHECK: #pragma omp target parallel for simd map(always,alloc: i) 161 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 162 // CHECK-NEXT: } 163 164 #pragma omp target parallel for simd nowait 165 for (T i = 0; i < 2; ++i) {} 166 // CHECK: #pragma omp target parallel for simd nowait 167 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 168 // CHECK-NEXT: } 169 170 #pragma omp target parallel for simd depend(in : argc, arr[i:argc], arr1[:]) 171 for (T i = 0; i < 2; ++i) {} 172 // CHECK: #pragma omp target parallel for simd depend(in : argc,arr[i:argc],arr1[:]) 173 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 174 // CHECK-NEXT: } 175 176 #pragma omp target parallel for simd defaultmap(tofrom: scalar) 177 for (T i = 0; i < 2; ++i) {} 178 // CHECK: #pragma omp target parallel for simd defaultmap(tofrom: scalar) 179 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 180 // CHECK-NEXT: } 181 182 #pragma omp target parallel for simd safelen(clen-1) 183 for (T i = 0; i < 2; ++i) {} 184 // CHECK: #pragma omp target parallel for simd safelen(clen - 1) 185 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 186 // CHECK-NEXT: } 187 188 #pragma omp target parallel for simd simdlen(clen-1) 189 for (T i = 0; i < 2; ++i) {} 190 // CHECK: #pragma omp target parallel for simd simdlen(clen - 1) 191 // CHECK-NEXT: for (T i = 0; i < 2; ++i) { 192 // CHECK-NEXT: } 193 194 #pragma omp target parallel for simd aligned(arr1:N-1) 195 for (T i = 0; i < N; ++i) {} 196 // CHECK: #pragma omp target parallel for simd aligned(arr1: N - 1) 197 // CHECK-NEXT: for (T i = 0; i < N; ++i) { 198 // CHECK-NEXT: } 199 200 return T(); 201 } 202 203 int main(int argc, char **argv) { 204 int b = argc, c, d, e, f, h; 205 int arr[5][10], arr1[5]; 206 int i, j; 207 int s; 208 static int a; 209 // CHECK: static int a; 210 const int clen = 5; 211 // CHECK: int clen = 5; 212 static float g; 213 #pragma omp threadprivate(g) 214 #pragma omp target parallel for simd schedule(guided, argc) default(none) linear(a) shared(argc) 215 // CHECK: #pragma omp target parallel for simd schedule(guided, argc) default(none) linear(a) shared(argc) 216 for (int i = 0; i < 2; ++i) 217 a = 2; 218 // CHECK-NEXT: for (int i = 0; i < 2; ++i) 219 // CHECK-NEXT: a = 2; 220 221 #pragma omp target parallel for simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) schedule(auto) ordered if (target: argc) num_threads(a) default(shared) shared(e) reduction(+ : h) linear(a:-5) 222 for (int i = 0; i < 10; ++i) 223 for (int j = 0; j < 10; ++j) 224 foo(); 225 // CHECK: #pragma omp target parallel for simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) schedule(auto) ordered if(target: argc) num_threads(a) default(shared) shared(e) reduction(+: h) linear(a: -5) 226 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 227 // CHECK-NEXT: for (int j = 0; j < 10; ++j) 228 // CHECK-NEXT: foo(); 229 230 #pragma omp target parallel for simd 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]) 231 for (int i = 0; i < 2; ++i) {} 232 // CHECK: #pragma omp target parallel for simd 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]) 233 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 234 // CHECK-NEXT: } 235 236 #pragma omp target parallel for simd if (5) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:5][:argc]) reduction(&& : h) 237 for (int i = 0; i < 2; ++i) {} 238 // CHECK: #pragma omp target parallel for simd if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: h) 239 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 240 // CHECK-NEXT: } 241 242 #pragma omp target parallel for simd if (target:argc > 0) 243 for (int i = 0; i < 2; ++i) {} 244 // CHECK: #pragma omp target parallel for simd if(target: argc > 0) 245 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 246 // CHECK-NEXT: } 247 248 #ifdef OMP5 249 #pragma omp target parallel for simd if (parallel:argc > 0) if(simd: argc) 250 #else 251 #pragma omp target parallel for simd if (parallel:argc > 0) 252 #endif // OMP5 253 for (int i = 0; i < 2; ++i) {} 254 // OMP45: #pragma omp target parallel for simd if(parallel: argc > 0) 255 // OMP50: #pragma omp target parallel for simd if(parallel: argc > 0) if(simd: argc) 256 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 257 // CHECK-NEXT: } 258 259 #pragma omp target parallel for simd if (5) 260 for (int i = 0; i < 2; ++i) {} 261 // CHECK: #pragma omp target parallel for simd if(5) 262 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 263 // CHECK-NEXT: } 264 265 #pragma omp target parallel for simd map(i) 266 for (int i = 0; i < 2; ++i) {} 267 // CHECK: #pragma omp target parallel for simd map(tofrom: i) 268 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 269 // CHECK-NEXT: } 270 271 #pragma omp target parallel for simd map(arr1[0:10], i) 272 for (int i = 0; i < 2; ++i) {} 273 // CHECK: #pragma omp target parallel for simd map(tofrom: arr1[0:10],i) 274 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 275 // CHECK-NEXT: } 276 277 #pragma omp target parallel for simd map(to: i) map(from: j) 278 for (int i = 0; i < 2; ++i) {} 279 // CHECK: #pragma omp target parallel for simd map(to: i) map(from: j) 280 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 281 // CHECK-NEXT: } 282 283 #pragma omp target parallel for simd map(always,alloc: i) 284 for (int i = 0; i < 2; ++i) {} 285 // CHECK: #pragma omp target parallel for simd map(always,alloc: i) 286 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 287 // CHECK-NEXT: } 288 289 #pragma omp target parallel for simd nowait 290 for (int i = 0; i < 2; ++i) {} 291 // CHECK: #pragma omp target parallel for simd nowait 292 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 293 // CHECK-NEXT: } 294 295 #pragma omp target parallel for simd depend(in : argc, arr[i:argc], arr1[:]) 296 for (int i = 0; i < 2; ++i) {} 297 // CHECK: #pragma omp target parallel for simd depend(in : argc,arr[i:argc],arr1[:]) 298 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 299 // CHECK-NEXT: } 300 301 #pragma omp target parallel for simd defaultmap(tofrom: scalar) 302 for (int i = 0; i < 2; ++i) {} 303 // CHECK: #pragma omp target parallel for simd defaultmap(tofrom: scalar) 304 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 305 // CHECK-NEXT: } 306 307 #pragma omp target parallel for simd safelen(clen-1) 308 for (int i = 0; i < 2; ++i) {} 309 // CHECK: #pragma omp target parallel for simd safelen(clen - 1) 310 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 311 // CHECK-NEXT: } 312 313 #pragma omp target parallel for simd simdlen(clen-1) 314 for (int i = 0; i < 2; ++i) {} 315 // CHECK: #pragma omp target parallel for simd simdlen(clen - 1) 316 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 317 // CHECK-NEXT: } 318 319 #pragma omp target parallel for simd aligned(arr1:4) 320 for (int i = 0; i < 2; ++i) {} 321 // CHECK: #pragma omp target parallel for simd aligned(arr1: 4) 322 // CHECK-NEXT: for (int i = 0; i < 2; ++i) { 323 // CHECK-NEXT: } 324 325 return (tmain<int, 5>(argc, &argc)); 326 } 327 328 #endif 329