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