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