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 --check-prefix HHECK --check-prefix HCHECK-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 --check-prefix HHECK --check-prefix HCHECK-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 --check-prefix HHECK --check-prefix HCHECK-64 |
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 --check-prefix HHECK --check-prefix HCHECK-64 |
7 | |
8 | // 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 --check-prefix HLAMBDA --check-prefix HLAMBDA-64 |
9 | // 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 |
10 | // 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 --check-prefix HLAMBDA --check-prefix HLAMBDA-64 |
11 | |
12 | // 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 %s --check-prefix SIMD-ONLY0 |
13 | // 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 |
14 | // 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 %s --check-prefix SIMD-ONLY0 |
15 | // 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 %s --check-prefix SIMD-ONLY0 |
16 | // 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 |
17 | // 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 %s --check-prefix SIMD-ONLY0 |
18 | |
19 | // 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 %s --check-prefix SIMD-ONLY0 |
20 | // 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 |
21 | // 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 %s --check-prefix SIMD-ONLY0 |
22 | |
23 | // Test target codegen - host bc file has to be created first. (no significant differences with host version of target region) |
24 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc |
25 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-64 --check-prefix TCHECK --check-prefix TCHECK-64 |
26 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s |
27 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-64 --check-prefix TCHECK --check-prefix TCHECK-64 |
28 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc |
29 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-32 --check-prefix TCHECK --check-prefix TCHECK-32 |
30 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s |
31 | // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix CHECK --check-prefix CHECK-32 --check-prefix TCHECK --check-prefix TCHECK-32 |
32 | |
33 | // RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc |
34 | // RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix LAMBDA --check-prefix LAMBDA-64 --check-prefix TLAMBDA --check-prefix TLAMBDA-64 |
35 | |
36 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc |
37 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix SIMD-ONLY0 |
38 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s |
39 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix SIMD-ONLY0 |
40 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc |
41 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix SIMD-ONLY0 |
42 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s |
43 | // RUN: %clang_cc1 -DCHECK -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix SIMD-ONLY0 |
44 | // |
45 | // RUN: %clang_cc1 -DLAMBDA -verify -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc |
46 | // 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 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck -allow-deprecated-dag-overlap %s --check-prefix SIMD-ONLY0 |
47 | // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} |
48 | |
49 | // expected-no-diagnostics |
50 | #ifndef HEADER |
51 | #define HEADER |
52 | |
53 | struct St { |
54 | int a, b; |
55 | St() : a(0), b(0) {} |
56 | St(const St &st) : a(st.a + st.b), b(0) {} |
57 | ~St() {} |
58 | }; |
59 | |
60 | volatile int g = 1212; |
61 | volatile int &g1 = g; |
62 | |
63 | template <class T> |
64 | struct S { |
65 | T f; |
66 | S(T a) : f(a + g) {} |
67 | S() : f(g) {} |
68 | S(const S &s, St t = St()) : f(s.f + t.a) {} |
69 | operator T() { return T(); } |
70 | ~S() {} |
71 | }; |
72 | |
73 | // CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float } |
74 | // CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} } |
75 | |
76 | template <typename T> |
77 | T tmain() { |
78 | S<T> test; |
79 | T t_var = T(); |
80 | T vec[] = {1, 2}; |
81 | S<T> s_arr[] = {1, 2}; |
82 | S<T> &var = test; |
83 | #pragma omp target teams distribute parallel for private(t_var, vec, s_arr, var) |
84 | for (int i = 0; i < 2; ++i) { |
85 | vec[i] = t_var; |
86 | s_arr[i] = var; |
87 | } |
88 | return T(); |
89 | } |
90 | |
91 | // HCHECK-DAG: [[TEST:@.+]] ={{.*}} global [[S_FLOAT_TY]] zeroinitializer, |
92 | S<float> test; |
93 | // HCHECK-DAG: [[T_VAR:@.+]] ={{.+}} global i{{[0-9]+}} 333, |
94 | int t_var = 333; |
95 | // HCHECK-DAG: [[VEC:@.+]] ={{.+}} global [2 x i{{[0-9]+}}] [i{{[0-9]+}} 1, i{{[0-9]+}} 2], |
96 | int vec[] = {1, 2}; |
97 | // HCHECK-DAG: [[S_ARR:@.+]] ={{.+}} global [2 x [[S_FLOAT_TY]]] zeroinitializer, |
98 | S<float> s_arr[] = {1, 2}; |
99 | // HCHECK-DAG: [[VAR:@.+]] ={{.+}} global [[S_FLOAT_TY]] zeroinitializer, |
100 | S<float> var(3); |
101 | // HCHECK-DAG: [[SIVAR:@.+]] = internal global i{{[0-9]+}} 0, |
102 | |
103 | int main() { |
104 | static int sivar; |
105 | #ifdef LAMBDA |
106 | // HLAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212, |
107 | // HLAMBDA-LABEL: @main |
108 | // HLAMBDA: call void [[OUTER_LAMBDA:@.+]]( |
109 | [&]() { |
110 | // HLAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]]( |
111 | // HLAMBDA: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 0, |
112 | // HLAMBDA: call void @[[LOFFL1:.+]]( |
113 | // HLAMBDA: ret |
114 | #pragma omp target teams distribute parallel for private(g, g1, sivar) |
115 | for (int i = 0; i < 2; ++i) { |
116 | // HLAMBDA: define{{.*}} internal{{.*}} void @[[LOFFL1]]() |
117 | // TLAMBDA: define{{.*}} void @[[LOFFL1:.+]]() |
118 | // LAMBDA: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}} @[[LOUTL1:.+]] to {{.+}}) |
119 | // LAMBDA: ret void |
120 | |
121 | // LAMBDA: define internal void @[[LOUTL1]]({{.+}}) |
122 | // Skip global, bound tid and loop vars |
123 | // LAMBDA: {{.+}} = alloca i32*, |
124 | // LAMBDA: {{.+}} = alloca i32*, |
125 | // LAMBDA: alloca i32, |
126 | // LAMBDA: alloca i32, |
127 | // LAMBDA: alloca i32, |
128 | // LAMBDA: alloca i32, |
129 | // LAMBDA: alloca i32, |
130 | // LAMBDA: alloca i32, |
131 | // LAMBDA: [[G_PRIV:%.+]] = alloca i{{[0-9]+}}, |
132 | // LAMBDA: [[G1_PRIV:%.+]] = alloca i{{[0-9]+}} |
133 | // LAMBDA: [[TMP:%.+]] = alloca i{{[0-9]+}}*, |
134 | // LAMBDA: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
135 | // LAMBDA: store{{.+}} [[G1_PRIV]], {{.+}} [[TMP]], |
136 | |
137 | g = 1; |
138 | g1 = 1; |
139 | sivar = 2; |
140 | // LAMBDA: call void @__kmpc_for_static_init_4( |
141 | // LAMBDA: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[LPAR_OUTL:.+]] to |
142 | // LAMBDA: call void @__kmpc_for_static_fini( |
143 | // LAMBDA: ret void |
144 | |
145 | // LAMBDA: define internal void @[[LPAR_OUTL]]({{.+}}) |
146 | // Skip global, bound tid and loop vars |
147 | // LAMBDA: {{.+}} = alloca i32*, |
148 | // LAMBDA: {{.+}} = alloca i32*, |
149 | // LAMBDA: alloca i{{[0-9]+}}, |
150 | // LAMBDA: alloca i{{[0-9]+}}, |
151 | // LAMBDA: alloca i32, |
152 | // LAMBDA: alloca i32, |
153 | // LAMBDA: alloca i32, |
154 | // LAMBDA: alloca i32, |
155 | // LAMBDA: alloca i32, |
156 | // LAMBDA: alloca i32, |
157 | // LAMBDA: [[G_PRIV:%.+]] = alloca i{{[0-9]+}}, |
158 | // LAMBDA: [[G1_PRIV:%.+]] = alloca i{{[0-9]+}} |
159 | // LAMBDA: [[TMP:%.+]] = alloca i{{[0-9]+}}*, |
160 | // LAMBDA: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
161 | // LAMBDA: store{{.+}} [[G1_PRIV]], {{.+}} [[TMP]], |
162 | // LAMBDA-DAG: store{{.+}} 1, {{.+}} [[G_PRIV]], |
163 | // LAMBDA-DAG: store{{.+}} 2, {{.+}} [[SIVAR_PRIV]], |
164 | // LAMBDA-DAG: [[G1_REF:%.+]] = load{{.+}}, {{.+}} [[TMP]], |
165 | // LAMBDA-DAG: store{{.+}} 1, {{.+}} [[G1_REF]], |
166 | // LAMBDA: call void [[INNER_LAMBDA:@.+]]( |
167 | // LAMBDA: call void @__kmpc_for_static_fini( |
168 | // LAMBDA: ret void |
169 | [&]() { |
170 | // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]]) |
171 | // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]], |
172 | g = 2; |
173 | g1 = 2; |
174 | sivar = 4; |
175 | // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]] |
176 | |
177 | // LAMBDA: [[G_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0 |
178 | // LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_PTR_REF]] |
179 | // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_REF]] |
180 | // LAMBDA: [[G1_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 1 |
181 | // LAMBDA: [[G1_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G1_PTR_REF]] |
182 | // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G1_REF]] |
183 | // LAMBDA: [[SIVAR_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 2 |
184 | // LAMBDA: [[SIVAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[SIVAR_PTR_REF]] |
185 | // LAMBDA: store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIVAR_REF]] |
186 | }(); |
187 | } |
188 | }(); |
189 | return 0; |
190 | #else |
191 | #pragma omp target teams distribute parallel for private(t_var, vec, s_arr, var, sivar) |
192 | for (int i = 0; i < 2; ++i) { |
193 | vec[i] = t_var; |
194 | s_arr[i] = var; |
195 | sivar += i; |
196 | } |
197 | return tmain<int>(); |
198 | #endif |
199 | } |
200 | |
201 | // HCHECK: define {{.*}}i{{[0-9]+}} @main() |
202 | // HCHECK: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 0, i8** null, i8** null, {{.+}} null, {{.+}} null, i32 0, i32 0) |
203 | // HCHECK: call void @[[OFFL1:.+]]() |
204 | // HCHECK: {{%.+}} = call{{.*}} i32 @[[TMAIN_INT:.+]]() |
205 | // HCHECK: ret |
206 | |
207 | // HCHECK: define{{.*}} void @[[OFFL1]]() |
208 | // TCHECK: define{{.*}} void @[[OFFL1:.+]]() |
209 | // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}} @[[OUTL1:.+]] to {{.+}}) |
210 | // CHECK: ret void |
211 | |
212 | // CHECK: define internal void @[[OUTL1]]({{.+}}) |
213 | // Skip global, bound tid and loop vars |
214 | // CHECK: {{.+}} = alloca i32*, |
215 | // CHECK: {{.+}} = alloca i32*, |
216 | // CHECK: {{.+}} = alloca i32, |
217 | // CHECK: {{.+}} = alloca i32, |
218 | // CHECK: {{.+}} = alloca i32, |
219 | // CHECK: {{.+}} = alloca i32, |
220 | // CHECK: {{.+}} = alloca i32, |
221 | // CHECK-DAG: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
222 | // CHECK-DAG: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], |
223 | // CHECK-DAG: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]], |
224 | // CHECK-DAG: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]], |
225 | // CHECK-DAG: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
226 | // CHECK: alloca i32, |
227 | |
228 | // private(s_arr) |
229 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* [[S_ARR_PRIV]], |
230 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
231 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
232 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
233 | |
234 | // private(var) |
235 | // CHECK-DAG: call void @{{.+}}({{.+}} [[VAR_PRIV]]) |
236 | |
237 | // CHECK: call void @__kmpc_for_static_init_4( |
238 | // CHECK: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[PAR_OUTL1:.+]] to |
239 | // CHECK: call void @__kmpc_for_static_fini( |
240 | // CHECK: ret void |
241 | |
242 | // CHECK: define internal void @[[PAR_OUTL1]]({{.+}}) |
243 | // Skip global, bound tid and loop vars |
244 | // CHECK: {{.+}} = alloca i32*, |
245 | // CHECK: {{.+}} = alloca i32*, |
246 | // CHECK: {{.+}} = alloca i{{[0-9]+}}, |
247 | // CHECK: {{.+}} = alloca i{{[0-9]+}}, |
248 | // CHECK: {{.+}} = alloca i32, |
249 | // CHECK: {{.+}} = alloca i32, |
250 | // CHECK: {{.+}} = alloca i32, |
251 | // CHECK: {{.+}} = alloca i32, |
252 | // CHECK: {{.+}} = alloca i32, |
253 | // CHECK: {{.+}} = alloca i32, |
254 | // CHECK-DAG: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
255 | // CHECK-DAG: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], |
256 | // CHECK-DAG: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]], |
257 | // CHECK-DAG: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]], |
258 | // CHECK-DAG: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
259 | // CHECK: alloca i32, |
260 | |
261 | // private(s_arr) |
262 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* [[S_ARR_PRIV]], |
263 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
264 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
265 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
266 | |
267 | // private(var) |
268 | // CHECK-DAG: call void @{{.+}}({{.+}} [[VAR_PRIV]]) |
269 | |
270 | // CHECK: call void @__kmpc_for_static_init_4( |
271 | // CHECK-DAG: {{.+}} = {{.+}} [[T_VAR_PRIV]] |
272 | // CHECK-DAG: {{.+}} = {{.+}} [[VEC_PRIV]] |
273 | // CHECK-DAG: {{.+}} = {{.+}} [[S_ARR_PRIV]] |
274 | // CHECK-DAG: {{.+}} = {{.+}} [[VAR_PRIV]] |
275 | // CHECK-DAG: {{.+}} = {{.+}} [[SIVAR_PRIV]] |
276 | // CHECK: call void @__kmpc_for_static_fini( |
277 | // CHECK: ret void |
278 | |
279 | // HCHECK: define{{.*}} i{{[0-9]+}} @[[TMAIN_INT]]() |
280 | // HCHECK: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 0, |
281 | // HCHECK: call void @[[TOFFL1:.+]]() |
282 | // HCHECK: ret |
283 | |
284 | // HCHECK: define {{.*}}void @[[TOFFL1]]() |
285 | // TCHECK: define weak void @[[TOFFL1:.+]]() |
286 | // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 0, {{.+}} @[[TOUTL1:.+]] to {{.+}}) |
287 | // CHECK: ret void |
288 | |
289 | // CHECK: define internal void @[[TOUTL1]]({{.+}}) |
290 | // Skip global, bound tid and loop vars |
291 | // CHECK: {{.+}} = alloca i32*, |
292 | // CHECK: {{.+}} = alloca i32*, |
293 | // CHECK: alloca i{{[0-9]+}}, |
294 | // CHECK: alloca i{{[0-9]+}}, |
295 | // CHECK: alloca i{{[0-9]+}}, |
296 | // CHECK: alloca i{{[0-9]+}}, |
297 | // CHECK: alloca i{{[0-9]+}}, |
298 | // CHECK: alloca i32, |
299 | // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
300 | // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], |
301 | // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]], |
302 | // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], |
303 | // CHECK: [[TMP:%.+]] = alloca [[S_INT_TY]]*, |
304 | |
305 | // private(s_arr) |
306 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]], |
307 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
308 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
309 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
310 | |
311 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]], |
312 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
313 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
314 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
315 | |
316 | // private(var) |
317 | // CHECK-DAG: call void @{{.+}}({{.+}} [[VAR_PRIV]]) |
318 | // CHECK-DAG: store{{.+}} [[VAR_PRIV]], {{.+}} [[TMP]] |
319 | |
320 | // CHECK: call void @__kmpc_for_static_init_4( |
321 | // CHECK: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[TPAR_OUTL1:.+]] to |
322 | // CHECK: call void @__kmpc_for_static_fini( |
323 | // CHECK: ret void |
324 | |
325 | // CHECK: define internal void @[[TPAR_OUTL1]]({{.+}}) |
326 | // Skip global, bound tid and loop vars |
327 | // CHECK: {{.+}} = alloca i32*, |
328 | // CHECK: {{.+}} = alloca i32*, |
329 | // prev lb and ub |
330 | // CHECK: alloca i{{[0-9]+}}, |
331 | // CHECK: alloca i{{[0-9]+}}, |
332 | // iter variables |
333 | // CHECK: alloca i{{[0-9]+}}, |
334 | // CHECK: alloca i{{[0-9]+}}, |
335 | // CHECK: alloca i{{[0-9]+}}, |
336 | // CHECK: alloca i{{[0-9]+}}, |
337 | // CHECK: alloca i{{[0-9]+}}, |
338 | // CHECK: alloca i32, |
339 | // CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, |
340 | // CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}], |
341 | // CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]], |
342 | // CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], |
343 | // CHECK: [[TMP:%.+]] = alloca [[S_INT_TY]]*, |
344 | |
345 | // private(s_arr) |
346 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]], |
347 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
348 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
349 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
350 | |
351 | // CHECK-DAG: [[S_ARR_PRIV_BGN:%.+]] = getelementptr{{.*}} [2 x [[S_INT_TY]]], [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]], |
352 | // CHECK-DAG: [[S_ARR_PTR_ALLOC:%.+]] = phi{{.+}} [ [[S_ARR_PRIV_BGN]], {{.+}} ], [ [[S_ARR_NEXT:%.+]], {{.+}} ] |
353 | // CHECK-DAG: call void @{{.+}}({{.+}} [[S_ARR_PTR_ALLOC]]) |
354 | // CHECK-DAG: [[S_ARR_NEXT]] = getelementptr {{.+}} [[S_ARR_PTR_ALLOC]], |
355 | |
356 | // private(var) |
357 | // CHECK-DAG: call void @{{.+}}({{.+}} [[VAR_PRIV]]) |
358 | // CHECK-DAG: store{{.+}} [[VAR_PRIV]], {{.+}} [[TMP]] |
359 | |
360 | // CHECK: call void @__kmpc_for_static_init_4( |
361 | // CHECK-DAG: {{.+}} = {{.+}} [[T_VAR_PRIV]] |
362 | // CHECK-DAG: {{.+}} = {{.+}} [[VEC_PRIV]] |
363 | // CHECK-DAG: {{.+}} = {{.+}} [[S_ARR_PRIV]] |
364 | // CHECK-DAG: {{.+}} = {{.+}} [[TMP]] |
365 | // CHECK: call void @__kmpc_for_static_fini( |
366 | // CHECK: ret void |
367 | |
368 | |
369 | #endif |
370 | |