1 // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s 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 | FileCheck %s 4 // expected-no-diagnostics 5 6 #ifndef HEADER 7 #define HEADER 8 9 void foo() {} 10 11 struct S { 12 S(): a(0) {} 13 S(int v) : a(v) {} 14 int a; 15 typedef int type; 16 }; 17 18 template <typename T> 19 class S7 : public T { 20 protected: 21 T a; 22 S7() : a(0) {} 23 24 public: 25 S7(typename T::type v) : a(v) { 26 #pragma omp target 27 #pragma omp teams distribute simd private(a) private(this->a) private(T::a) 28 for (int k = 0; k < a.a; ++k) 29 ++this->a.a; 30 } 31 S7 &operator=(S7 &s) { 32 #pragma omp target 33 #pragma omp teams distribute simd private(a) private(this->a) 34 for (int k = 0; k < s.a.a; ++k) 35 ++s.a.a; 36 return *this; 37 } 38 void foo() { 39 int b, argv, d, c, e, f; 40 #pragma omp target 41 #pragma omp teams distribute simd default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) 42 for (int k = 0; k < a.a; ++k) 43 ++a.a; 44 } 45 void bar() { 46 int arr[10]; 47 const int alen = 16; 48 const int slen1 = 8; 49 const int slen2 = 8; 50 #pragma omp target 51 #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr:alen) 52 for (int k = 0; k < a.a; ++k) 53 ++a.a; 54 } 55 }; 56 // CHECK: #pragma omp target 57 // CHECK-NEXT: #pragma omp teams distribute simd private(this->a) private(this->a) private(T::a) 58 // CHECK: #pragma omp target 59 // CHECK-NEXT: #pragma omp teams distribute simd private(this->a) private(this->a) 60 // CHECK: #pragma omp target 61 // 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) 62 // CHECK: #pragma omp target 63 // CHECK-NEXT: #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr: alen) 64 // CHECK: #pragma omp target 65 // CHECK-NEXT: #pragma omp teams distribute simd private(this->a) private(this->a) private(this->S::a) 66 67 class S8 : public S7<S> { 68 S8() {} 69 70 public: 71 S8(int v) : S7<S>(v){ 72 #pragma omp target 73 #pragma omp teams distribute simd private(a) private(this->a) private(S7<S>::a) 74 for (int k = 0; k < a.a; ++k) 75 ++this->a.a; 76 } 77 S8 &operator=(S8 &s) { 78 #pragma omp target 79 #pragma omp teams distribute simd private(a) private(this->a) 80 for (int k = 0; k < s.a.a; ++k) 81 ++s.a.a; 82 return *this; 83 } 84 void bar() { 85 int b, argv, d, c, e, f; 86 #pragma omp target 87 #pragma omp teams distribute simd default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) 88 for (int k = 0; k < a.a; ++k) 89 ++a.a; 90 } 91 void foo() { 92 const int alen = 16; 93 const int slen1 = 8; 94 const int slen2 = 8; 95 int arr[10]; 96 #pragma omp target 97 #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr:alen) 98 for (int k = 0; k < a.a; ++k) 99 ++a.a; 100 } 101 }; 102 // CHECK: #pragma omp target 103 // CHECK-NEXT: #pragma omp teams distribute simd private(this->a) private(this->a) private(this->S7<S>::a) 104 // CHECK: #pragma omp target 105 // CHECK-NEXT: #pragma omp teams distribute simd private(this->a) private(this->a) 106 // CHECK: #pragma omp target 107 // 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) 108 // CHECK: #pragma omp target 109 // CHECK-NEXT: #pragma omp teams distribute simd simdlen(slen1) safelen(slen2) aligned(arr: alen) 110 111 template <class T, int N> 112 T tmain(T argc) { 113 T b = argc, c, d, e, f, g; 114 static T a; 115 // CHECK: static T a; 116 const T clen = 5; 117 const T alen = 16; 118 int arr[10]; 119 #pragma omp target 120 #pragma omp teams distribute simd 121 for (int i=0; i < 2; ++i) 122 a = 2; 123 // CHECK: #pragma omp target 124 // CHECK-NEXT: #pragma omp teams distribute simd 125 // CHECK-NEXT: for (int i = 0; i < 2; ++i) 126 // CHECK-NEXT: a = 2; 127 #pragma omp target 128 #pragma omp teams distribute simd private(argc, b), firstprivate(c, d), collapse(2) 129 for (int i = 0; i < 10; ++i) 130 for (int j = 0; j < 10; ++j) 131 foo(); 132 // CHECK: #pragma omp target 133 // CHECK-NEXT: #pragma omp teams distribute simd private(argc,b) firstprivate(c,d) collapse(2) 134 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 135 // CHECK-NEXT: for (int j = 0; j < 10; ++j) 136 // CHECK-NEXT: foo(); 137 for (int i = 0; i < 10; ++i) 138 foo(); 139 // CHECK: for (int i = 0; i < 10; ++i) 140 // CHECK-NEXT: foo(); 141 #pragma omp target 142 #pragma omp teams distribute simd 143 for (int i = 0; i < 10; ++i) 144 foo(); 145 // CHECK: #pragma omp target 146 // CHECK-NEXT: #pragma omp teams distribute simd 147 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 148 // CHECK-NEXT: foo(); 149 #pragma omp target 150 #pragma omp teams distribute simd default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) 151 for (int k = 0; k < 10; ++k) 152 e += d + argc; 153 // CHECK: #pragma omp target 154 // 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) 155 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 156 // CHECK-NEXT: e += d + argc; 157 #pragma omp target 158 #pragma omp teams distribute simd simdlen(clen-1) linear(d) 159 for (int k = 0; k < 10; ++k) 160 e += d + argc; 161 // CHECK: #pragma omp target 162 // CHECK-NEXT: #pragma omp teams distribute simd simdlen(clen - 1) linear(d) 163 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 164 // CHECK-NEXT: e += d + argc; 165 #pragma omp target 166 #pragma omp teams distribute simd safelen(clen-1) aligned(arr:alen) 167 for (int k = 0; k < 10; ++k) 168 e += d + argc + arr[k]; 169 // CHECK: #pragma omp target 170 // CHECK-NEXT: #pragma omp teams distribute simd safelen(clen - 1) aligned(arr: alen) 171 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 172 // CHECK-NEXT: e += d + argc + arr[k]; 173 return T(); 174 } 175 176 int main (int argc, char **argv) { 177 int b = argc, c, d, e, f, g; 178 static int a; 179 // CHECK: static int a; 180 const int clen = 5; 181 const int N = 10; 182 int arr[10]; 183 #pragma omp target 184 #pragma omp teams distribute simd 185 for (int i=0; i < 2; ++i) 186 a = 2; 187 // CHECK: #pragma omp target 188 // CHECK-NEXT: #pragma omp teams distribute simd 189 // CHECK-NEXT: for (int i = 0; i < 2; ++i) 190 // CHECK-NEXT: a = 2; 191 #pragma omp target 192 #pragma omp teams distribute simd private(argc,b),firstprivate(argv, c), collapse(2) 193 for (int i = 0; i < 10; ++i) 194 for (int j = 0; j < 10; ++j) 195 foo(); 196 // CHECK: #pragma omp target 197 // CHECK-NEXT: #pragma omp teams distribute simd private(argc,b) firstprivate(argv,c) collapse(2) 198 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 199 // CHECK-NEXT: for (int j = 0; j < 10; ++j) 200 // CHECK-NEXT: foo(); 201 for (int i = 0; i < 10; ++i) 202 foo(); 203 // CHECK: for (int i = 0; i < 10; ++i) 204 // CHECK-NEXT: foo(); 205 #pragma omp target 206 #pragma omp teams distribute simd 207 for (int i = 0; i < 10; ++i)foo(); 208 // CHECK: #pragma omp target 209 // CHECK-NEXT: #pragma omp teams distribute simd 210 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 211 // CHECK-NEXT: foo(); 212 #pragma omp target 213 #pragma omp teams distribute simd default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) 214 for (int k = 0; k < 10; ++k) 215 e += d + argc; 216 // CHECK: #pragma omp target 217 // 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) 218 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 219 // CHECK-NEXT: e += d + argc; 220 #pragma omp target 221 #pragma omp teams distribute simd simdlen(clen-1) linear(d) 222 for (int k = 0; k < 10; ++k) 223 e += d + argc; 224 // CHECK: #pragma omp target 225 // CHECK-NEXT: #pragma omp teams distribute simd simdlen(clen - 1) linear(d) 226 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 227 // CHECK-NEXT: e += d + argc; 228 #pragma omp target 229 #pragma omp teams distribute simd safelen(clen-1) aligned(arr:N+6) 230 for (int k = 0; k < 10; ++k) 231 e += d + argc + arr[k]; 232 // CHECK: #pragma omp target 233 // CHECK-NEXT: #pragma omp teams distribute simd safelen(clen - 1) aligned(arr: N + 6) 234 // CHECK-NEXT: for (int k = 0; k < 10; ++k) 235 // CHECK-NEXT: e += d + argc + arr[k]; 236 return (0); 237 } 238 239 #endif 240