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