1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s | 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 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45 4 // RUN: %clang_cc1 -verify -fopenmp -DOMP5 -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50 5 // RUN: %clang_cc1 -fopenmp -DOMP5 -x c++ -std=c++11 -emit-pch -o %t %s 6 // RUN: %clang_cc1 -fopenmp -DOMP5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50 7 8 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | 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 10 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=CHECK --check-prefix=OMP45 11 // RUN: %clang_cc1 -verify -fopenmp-simd -DOMP5 -ast-print %s | FileCheck %s --check-prefix=CHECK --check-prefix=OMP50 12 // RUN: %clang_cc1 -fopenmp-simd -DOMP5 -x c++ -std=c++11 -emit-pch -o %t %s 13 // RUN: %clang_cc1 -fopenmp-simd -DOMP5 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | 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 S1 { 22 S1() : a(0) {} 23 S1(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 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 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 parallel for simd private(this->a) private(this->a) private(T::a){{$}} 49 // CHECK: #pragma omp parallel for simd private(this->a) private(this->a) 50 // CHECK: #pragma omp parallel for simd private(this->a) private(this->a) private(this->S1::a) 51 52 class S8 : public S7<S1> { 53 S8() {} 54 55 public: 56 S8(int v) : S7<S1>(v){ 57 #pragma omp parallel for simd private(a) private(this->a) private(S7 <S1>::a) 58 for (int k = 0; k < a.a; ++k) 59 ++this->a.a; 60 } 61 S8 &operator=(S8 &s) { 62 #pragma omp 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 parallel for simd private(this->a) private(this->a) private(this->S7<S1>::a) 70 // CHECK: #pragma omp parallel for simd private(this->a) private(this->a) 71 72 int g_ind = 1; 73 template<class T, class N> T reduct(T* arr, N num) { 74 N i; 75 N ind; 76 N myind; 77 T sum = (T)0; 78 // CHECK: T sum = (T)0; 79 #pragma omp parallel for simd private(myind, g_ind), linear(ind), aligned(arr) if (parallel :num) 80 // CHECK-NEXT: #pragma omp parallel for simd private(myind,g_ind) linear(ind) aligned(arr) if(parallel: num) 81 for (i = 0; i < num; ++i) { 82 myind = ind; 83 T cur = arr[myind]; 84 ind += g_ind; 85 sum += cur; 86 } 87 } 88 89 template<class T> struct S { 90 S(const T &a) 91 :m_a(a) 92 {} 93 T result(T *v) const { 94 T res; 95 T val; 96 T lin = 0; 97 // CHECK: T res; 98 // CHECK: T val; 99 // CHECK: T lin = 0; 100 #pragma omp parallel for simd private(val) safelen(7) linear(lin : -5) lastprivate(res) simdlen(5) if(7) allocate(lin) 101 // CHECK-NEXT: #pragma omp parallel for simd private(val) safelen(7) linear(lin: -5) lastprivate(res) simdlen(5) if(7) allocate(lin) 102 for (T i = 7; i < m_a; ++i) { 103 val = v[i-7] + m_a; 104 res = val; 105 lin -= 5; 106 } 107 const T clen = 3; 108 // CHECK: T clen = 3; 109 #pragma omp parallel for simd safelen(clen-1) simdlen(clen-1) ordered 110 // CHECK-NEXT: #pragma omp parallel for simd safelen(clen - 1) simdlen(clen - 1) ordered 111 for(T i = clen+2; i < 20; ++i) { 112 // CHECK-NEXT: for (T i = clen + 2; i < 20; ++i) { 113 v[i] = v[v-clen] + 1; 114 // CHECK-NEXT: v[i] = v[v - clen] + 1; 115 } 116 // CHECK-NEXT: } 117 return res; 118 } 119 ~S() 120 {} 121 T m_a; 122 }; 123 124 template<int LEN> struct S2 { 125 static void func(int n, float *a, float *b, float *c) { 126 int k1 = 0, k2 = 0; 127 #pragma omp parallel for simd allocate(k1) safelen(LEN) linear(k1,k2:LEN) aligned(a:LEN) simdlen(LEN) 128 for(int i = 0; i < n; i++) { 129 c[i] = a[i] + b[i]; 130 c[k1] = a[k1] + b[k1]; 131 c[k2] = a[k2] + b[k2]; 132 k1 = k1 + LEN; 133 k2 = k2 + LEN; 134 } 135 } 136 }; 137 138 // S2<4>::func is called below in main. 139 // CHECK: template<> struct S2<4> { 140 // CHECK-NEXT: static void func(int n, float *a, float *b, float *c) { 141 // CHECK-NEXT: int k1 = 0, k2 = 0; 142 // CHECK-NEXT: #pragma omp parallel for simd allocate(k1) safelen(4) linear(k1,k2: 4) aligned(a: 4) simdlen(4) 143 // CHECK-NEXT: for (int i = 0; i < n; i++) { 144 // CHECK-NEXT: c[i] = a[i] + b[i]; 145 // CHECK-NEXT: c[k1] = a[k1] + b[k1]; 146 // CHECK-NEXT: c[k2] = a[k2] + b[k2]; 147 // CHECK-NEXT: k1 = k1 + 4; 148 // CHECK-NEXT: k2 = k2 + 4; 149 // CHECK-NEXT: } 150 // CHECK-NEXT: } 151 152 int main (int argc, char **argv) { 153 int b = argc, c, d, e, f, g; 154 int k1=0,k2=0; 155 static int *a; 156 // CHECK: static int *a; 157 #ifdef OMP5 158 #pragma omp parallel for simd if(parallel :b) if(simd: b) nontemporal(argc, c) lastprivate(conditional:d,f) order(concurrent) 159 #else 160 #pragma omp parallel for simd if(parallel :b) ordered 161 #endif // OMP5 162 // OMP50-NEXT: #pragma omp parallel for simd if(parallel: b) if(simd: b) nontemporal(argc,c) lastprivate(conditional: d,f) order(concurrent) 163 // OMP45-NEXT: #pragma omp parallel for simd if(parallel: b) ordered 164 for (int i=0; i < 2; ++i)*a=2; 165 // CHECK-NEXT: for (int i = 0; i < 2; ++i) 166 // CHECK-NEXT: *a = 2; 167 #pragma omp parallel 168 #pragma omp parallel for simd private(argc, b),lastprivate(d,f) collapse(2) aligned(a : 4) ,firstprivate( g ) if(g) 169 for (int i = 0; i < 10; ++i) 170 for (int j = 0; j < 10; ++j) {foo(); k1 += 8; k2 += 8;} 171 // CHECK-NEXT: #pragma omp parallel 172 // CHECK-NEXT: #pragma omp parallel for simd private(argc,b) lastprivate(d,f) collapse(2) aligned(a: 4) firstprivate(g) if(g) 173 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 174 // CHECK-NEXT: for (int j = 0; j < 10; ++j) { 175 // CHECK-NEXT: foo(); 176 // CHECK-NEXT: k1 += 8; 177 // CHECK-NEXT: k2 += 8; 178 // CHECK-NEXT: } 179 for (int i = 0; i < 10; ++i)foo(); 180 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 181 // CHECK-NEXT: foo(); 182 const int CLEN = 4; 183 // CHECK-NEXT: const int CLEN = 4; 184 #pragma omp parallel for simd aligned(a:CLEN) linear(a:CLEN) safelen(CLEN) collapse( 1 ) simdlen(CLEN) 185 // CHECK-NEXT: #pragma omp parallel for simd aligned(a: CLEN) linear(a: CLEN) safelen(CLEN) collapse(1) simdlen(CLEN) 186 for (int i = 0; i < 10; ++i)foo(); 187 // CHECK-NEXT: for (int i = 0; i < 10; ++i) 188 // CHECK-NEXT: foo(); 189 190 float arr[16]; 191 S2<4>::func(0,arr,arr,arr); 192 return (0); 193 } 194 195 #endif 196