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