1 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-64 |
2 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s |
3 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-64 |
4 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-32 |
5 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s |
6 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-32 |
7 | |
8 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s |
9 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s |
10 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s |
11 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s |
12 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s |
13 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY0 %s |
14 | // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} |
15 | |
16 | // RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix LAMBDA --check-prefix LAMBDA-64 |
17 | // RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s |
18 | // RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix LAMBDA --check-prefix LAMBDA-64 |
19 | |
20 | // RUN: %clang_cc1 -DLAMBDA -verify -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY1 %s |
21 | // RUN: %clang_cc1 -DLAMBDA -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s |
22 | // RUN: %clang_cc1 -DLAMBDA -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap --check-prefix SIMD-ONLY1 %s |
23 | // SIMD-ONLY1-NOT: {{__kmpc|__tgt}} |
24 | |
25 | // expected-no-diagnostics |
26 | #ifndef HEADER |
27 | #define HEADER |
28 | |
29 | struct St { |
30 | int a, b; |
31 | St() : a(0), b(0) {} |
32 | St(const St &st) : a(st.a + st.b), b(0) {} |
33 | ~St() {} |
34 | }; |
35 | |
36 | volatile int g = 1212; |
37 | volatile int &g1 = g; |
38 | |
39 | template <class T> |
40 | struct S { |
41 | T f; |
42 | S(T a) : f(a + g) {} |
43 | S() : f(g) {} |
44 | S(const S &s, St t = St()) : f(s.f + t.a) {} |
45 | operator T() { return T(); } |
46 | ~S() {} |
47 | }; |
48 | |
49 | // CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float } |
50 | // CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} } |
51 | |
52 | template <typename T> |
53 | T tmain() { |
54 | S<T> test; |
55 | T t_var = T(); |
56 | T vec[] = {1, 2}; |
57 | S<T> s_arr[] = {1, 2}; |
58 | S<T> &var = test; |
59 | #pragma omp target |
60 | #pragma omp teams distribute simd private(t_var, vec, s_arr, var) |
61 | for (int i = 0; i < 2; ++i) { |
62 | vec[i] = t_var; |
63 | s_arr[i] = var; |
64 | } |
65 | return T(); |
66 | } |
67 | |
68 | // CHECK-DAG: [[TEST:@.+]] = global [[S_FLOAT_TY]] zeroinitializer, |
69 | S<float> test; |
70 | // CHECK-DAG: [[T_VAR:@.+]] = global i{{[0-9]+}} 333, |
71 | int t_var = 333; |
72 | // CHECK-DAG: [[VEC:@.+]] = global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 1, i{{[0-9]+}} 2], |
73 | int vec[] = {1, 2}; |
74 | // CHECK-DAG: [[S_ARR:@.+]] = global [2 x [[S_FLOAT_TY]]] zeroinitializer, |
75 | S<float> s_arr[] = {1, 2}; |
76 | // CHECK-DAG: [[VAR:@.+]] = global [[S_FLOAT_TY]] zeroinitializer, |
77 | S<float> var(3); |
78 | // CHECK-DAG: [[SIVAR:@.+]] = internal global i{{[0-9]+}} 0, |
79 | |
80 | int main() { |
81 | static int sivar; |
82 | #ifdef LAMBDA |
83 | // LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212, |
84 | // LAMBDA-LABEL: @main |
85 | // LAMBDA: call void [[OUTER_LAMBDA:@.+]]( |
86 | [&]() { |
87 | // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]]( |
88 | // LAMBDA: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 1, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i64* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 0, i32 0) |
89 | // LAMBDA: call void @[[LOFFL1:.+]]( |
90 | // LAMBDA: ret |
91 | #pragma omp target |
92 | #pragma omp teams distribute simd private(g, g1, sivar) |
93 | for (int i = 0; i < 2; ++i) { |
94 | // LAMBDA: define{{.*}} internal{{.*}} void @[[LOFFL1]](i{{64|32}} {{%.+}}) |
95 | // LAMBDA: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}} @[[LOUTL1:.+]] to {{.+}}) |
96 | // LAMBDA: ret void |
97 | |
98 | // LAMBDA: define internal void @[[LOUTL1]]({{.+}}) |
99 | // Skip global, bound tid and loop vars |
100 | // LAMBDA: {{.+}} = alloca i32*, |
101 | // LAMBDA: {{.+}} = alloca i32*, |
102 | // LAMBDA: alloca i32, |
103 | // LAMBDA: alloca i32, |
104 | // LAMBDA: alloca i32, |
105 | // LAMBDA: alloca i32, |
106 | // LAMBDA: alloca i32, |
107 | // LAMBDA: alloca i32, |
108 | // LAMBDA: [[G_PRIV:%.+]] = alloca i{{[0-9]+}}, |
109 | // LAMBDA: [[G1_PRIV:%.+]] = alloca i{{[0-9]+}} |
110 | // LAMBDA: [[TMP:%.+]] = alloca i{{[0-9]+}}*, |
111 | // LAMBDA: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
112 | // LAMBDA: store{{.+}} [[G1_PRIV]], {{.+}} [[TMP]], |
113 | |
114 | g = 1; |
115 | g1 = 1; |
116 | sivar = 2; |
117 | // LAMBDA: call void @__kmpc_for_static_init_4( |
118 | // LAMBDA-DAG: store{{.+}} 1, {{.+}} [[G_PRIV]], |
119 | // LAMBDA-DAG: store{{.+}} 2, {{.+}} [[SIVAR_PRIV]], |
120 | // LAMBDA-DAG: [[G1_REF:%.+]] = load{{.+}}, {{.+}} [[TMP]], |
121 | // LAMBDA-DAG: store{{.+}} 1, {{.+}} [[G1_REF]], |
122 | // LAMBDA: call void [[INNER_LAMBDA:@.+]]( |
123 | // LAMBDA: call void @__kmpc_for_static_fini( |
124 | [&]() { |
125 | // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]]) |
126 | // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]], |
127 | g = 2; |
128 | g1 = 2; |
129 | sivar = 4; |
130 | // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]] |
131 | |
132 | // LAMBDA: [[G_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 |
133 | // LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_PTR_REF]] |
134 | // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_REF]] |
135 | // LAMBDA: [[G1_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 |
136 | // LAMBDA: [[G1_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G1_PTR_REF]] |
137 | // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G1_REF]] |
138 | // LAMBDA: [[SIVAR_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 2 |
139 | // LAMBDA: [[SIVAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[SIVAR_PTR_REF]] |
140 | // LAMBDA: store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIVAR_REF]] |
141 | }(); |
142 | } |
143 | }(); |
144 | return 0; |
145 | #else |
146 | #pragma omp target |
147 | #pragma omp teams distribute simd private(t_var, vec, s_arr, var, sivar) |
148 | for (int i = 0; i < 2; ++i) { |
149 | vec[i] = t_var; |
150 | s_arr[i] = var; |
151 | sivar += i; |
152 | } |
153 | return tmain<int>(); |
154 | #endif |
155 | } |
156 | |
157 | // CHECK: define {{.*}}i{{[0-9]+}} @main() |
158 | // CHECK: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 0, i8** null, i8** null, i{{64|32}}* null, i64* null, i32 0, i32 0) |
159 | // CHECK: call void @[[OFFL1:.+]]() |
160 | // CHECK: {{%.+}} = call{{.*}} i32 @[[TMAIN_INT:.+]]() |
161 | // CHECK: ret |
162 | |
163 | // CHECK: define{{.*}} void @[[OFFL1]]() |
164 | // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}} @[[OUTL1:.+]] to {{.+}}) |
165 | // CHECK: ret void |
166 | |
167 | // CHECK: define internal void @[[OUTL1]]({{.+}}) |
168 | // Skip global, bound tid and loop vars |
169 | // CHECK: {{.+}} = alloca i32*, |
170 | // CHECK: {{.+}} = alloca i32*, |
171 | // CHECK: {{.+}} = alloca i32, |
172 | // CHECK: {{.+}} = alloca i32, |
173 | // CHECK: {{.+}} = alloca i32, |
174 | // CHECK: {{.+}} = alloca i32, |
175 | // CHECK: {{.+}} = alloca i32, |
176 | // CHECK: {{.+}} = alloca i32, |
177 | // CHECK-DAG: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
178 | // CHECK-DAG: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], |
179 | // CHECK-DAG: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]], |
180 | // CHECK-DAG: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]], |
181 | // CHECK-DAG: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
182 | |
183 | // private(s_arr) |
184 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* [[S_ARR_PRIV]], |
185 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
186 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
187 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
188 | |
189 | // private(var) |
190 | // CHECK-DAG: call void @{{.+}}({{.+}} [[VAR_PRIV]]) |
191 | |
192 | // CHECK: call void @__kmpc_for_static_init_4( |
193 | // CHECK-DAG: {{.+}} = {{.+}} [[T_VAR_PRIV]] |
194 | // CHECK-DAG: {{.+}} = {{.+}} [[VEC_PRIV]] |
195 | // CHECK-DAG: {{.+}} = {{.+}} [[S_ARR_PRIV]] |
196 | // CHECK-DAG: {{.+}} = {{.+}} [[VAR_PRIV]] |
197 | // CHECK-DAG: {{.+}} = {{.+}} [[SIVAR_PRIV]] |
198 | // CHECK: call void @__kmpc_for_static_fini( |
199 | // CHECK: ret void |
200 | |
201 | |
202 | // CHECK: define{{.*}} i{{[0-9]+}} @[[TMAIN_INT]]() |
203 | // CHECK: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 0, |
204 | // CHECK: call void @[[TOFFL1:.+]]() |
205 | // CHECK: ret |
206 | |
207 | // CHECK: define {{.*}}void @[[TOFFL1]]() |
208 | // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}} @[[TOUTL1:.+]] to {{.+}}) |
209 | // CHECK: ret void |
210 | |
211 | // CHECK: define internal void @[[TOUTL1]]({{.+}}) |
212 | // Skip global, bound tid and loop vars |
213 | // CHECK: {{.+}} = alloca i32*, |
214 | // CHECK: {{.+}} = alloca i32*, |
215 | // CHECK: alloca i{{[0-9]+}}, |
216 | // CHECK: alloca i{{[0-9]+}}, |
217 | // CHECK: alloca i{{[0-9]+}}, |
218 | // CHECK: alloca i{{[0-9]+}}, |
219 | // CHECK: alloca i{{[0-9]+}}, |
220 | // CHECK: alloca i{{[0-9]+}}, |
221 | // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
222 | // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], |
223 | // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]], |
224 | // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], |
225 | // CHECK: [[TMP:%.+]] = alloca [[S_INT_TY]]*, |
226 | |
227 | // private(s_arr) |
228 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]], |
229 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
230 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
231 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
232 | |
233 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]], |
234 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
235 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
236 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
237 | |
238 | // private(var) |
239 | // CHECK-DAG: call void @{{.+}}({{.+}} [[VAR_PRIV]]) |
240 | // CHECK-DAG: store{{.+}} [[VAR_PRIV]], {{.+}} [[TMP]] |
241 | |
242 | // CHECK: call void @__kmpc_for_static_init_4( |
243 | // CHECK-DAG: {{.+}} = {{.+}} [[T_VAR_PRIV]] |
244 | // CHECK-DAG: {{.+}} = {{.+}} [[VEC_PRIV]] |
245 | // CHECK-DAG: {{.+}} = {{.+}} [[S_ARR_PRIV]] |
246 | // CHECK-DAG: {{.+}} = {{.+}} [[TMP]] |
247 | // CHECK: call void @__kmpc_for_static_fini( |
248 | // CHECK: ret void |
249 | |
250 | // CHECK: !{!"llvm.loop.vectorize.enable", i1 true} |
251 | #endif |
252 | |