1 | // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %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 %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 %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 %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 --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 --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 --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 --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 %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 %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 --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 --check-prefix SIMD-ONLY1 %s |
23 | // SIMD-ONLY1-NOT: {{__kmpc|__tgt}} |
24 | |
25 | // expected-no-diagnostics |
26 | #ifndef HEADER |
27 | #define HEADER |
28 | |
29 | int x; |
30 | #pragma omp threadprivate(x) |
31 | |
32 | template <typename T> |
33 | T tmain() { |
34 | int a[2]; |
35 | #pragma omp target |
36 | #pragma omp teams distribute parallel for copyin(x) |
37 | for (int i = 0; i < 2; ++i) { |
38 | a[i] = x; |
39 | } |
40 | return T(); |
41 | } |
42 | |
43 | int main() { |
44 | int a[2]; |
45 | #ifdef LAMBDA |
46 | // LAMBDA-LABEL: @main |
47 | // LAMBDA: call void [[OUTER_LAMBDA:@.+]]( |
48 | [&]() { |
49 | // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]]( |
50 | // LAMBDA: call i32 @__tgt_target_teams( |
51 | // LAMBDA: call void @[[LOFFL1:.+]]( |
52 | // LAMBDA: ret |
53 | #pragma omp target |
54 | #pragma omp teams distribute parallel for copyin(x) |
55 | for (int i = 0; i < 2; ++i) { |
56 | // LAMBDA: define{{.*}} internal{{.*}} void @[[LOFFL1]]( |
57 | // LAMBDA: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 {{.+}}, {{.+}} @[[LOUTL1:.+]] to {{.+}}) |
58 | // LAMBDA: ret void |
59 | |
60 | // LAMBDA: define internal void @[[LOUTL1]]( |
61 | // Skip global, bound tid and loop vars |
62 | // LAMBDA: {{.+}} = alloca i32*, |
63 | // LAMBDA: {{.+}} = alloca i32*, |
64 | // LAMBDA: alloca i32, |
65 | // LAMBDA: alloca i32, |
66 | // LAMBDA: alloca i32, |
67 | // LAMBDA: alloca i32, |
68 | // LAMBDA: alloca i32, |
69 | a[i] = x; |
70 | |
71 | // LAMBDA: call void @__kmpc_for_static_init_4( |
72 | // LAMBDA: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[LPAR_OUTL:.+]] to |
73 | // LAMBDA: call void @__kmpc_for_static_fini( |
74 | // LAMBDA: ret void |
75 | |
76 | // LAMBDA: define internal void @[[LPAR_OUTL]]({{.+}}) |
77 | // Skip global, bound tid and loop vars |
78 | // LAMBDA: {{.+}} = alloca i32*, |
79 | // LAMBDA: {{.+}} = alloca i32*, |
80 | // LAMBDA: alloca i{{[0-9]+}}, |
81 | // LAMBDA: alloca i{{[0-9]+}}, |
82 | // LAMBDA: {{%.+}} = alloca [2 x i{{[0-9]+}}]*, |
83 | // LAMBDA: [[X_ADDR:%.+]] = alloca i{{[0-9]+}}*, |
84 | // LAMBDA: alloca i32, |
85 | // LAMBDA: alloca i32, |
86 | // LAMBDA: alloca i32, |
87 | // LAMBDA: alloca i32, |
88 | // LAMBDA: alloca i32, |
89 | |
90 | // LAMBDA: [[X_REF:%.+]] = load {{.+}}, {{.+}} [[X_ADDR]], |
91 | |
92 | // LAMBDA: call void @__kmpc_for_static_init_4( |
93 | // LAMBDA: [[X_VAL:%.+]] = load {{.+}}, {{.+}} [[X_REF]], |
94 | // LAMBDA: store {{.+}} [[X_VAL]], |
95 | // LAMBDA: call void [[INNER_LAMBDA:@.+]]( |
96 | // LAMBDA: call void @__kmpc_for_static_fini( |
97 | // LAMBDA: ret void |
98 | [&]() { |
99 | // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]]) |
100 | // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]], |
101 | a[i] = x; |
102 | }(); |
103 | } |
104 | }(); |
105 | return 0; |
106 | #else |
107 | #pragma omp target |
108 | #pragma omp teams distribute parallel for copyin(x) |
109 | for (int i = 0; i < 2; ++i) { |
110 | a[i] = x; |
111 | } |
112 | return tmain<int>(); |
113 | //return 0; |
114 | #endif |
115 | } |
116 | |
117 | // CHECK: define {{.*}}i{{[0-9]+}} @main() |
118 | // CHECK: call i32 @__tgt_target_teams( |
119 | // CHECK: call void @[[OFFL1:.+]](i{{64|32}} %{{.+}}) |
120 | // CHECK: {{%.+}} = call{{.*}} i32 @[[TMAIN_INT:.+]]() |
121 | // CHECK: ret |
122 | |
123 | // CHECK: define{{.*}} void @[[OFFL1]]({{.+}}) |
124 | // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 {{.+}}, {{.+}} @[[OUTL1:.+]] to {{.+}}) |
125 | // CHECK: ret void |
126 | |
127 | // CHECK: define internal void @[[OUTL1]]({{.+}}) |
128 | // Skip global, bound tid and loop vars |
129 | // CHECK: {{.+}} = alloca i32*, |
130 | // CHECK: {{.+}} = alloca i32*, |
131 | // CHECK: {{.+}} = alloca i32, |
132 | // CHECK: {{.+}} = alloca i32, |
133 | // CHECK: {{.+}} = alloca i32, |
134 | // CHECK: {{.+}} = alloca i32, |
135 | // CHECK: {{.+}} = alloca i32, |
136 | |
137 | // CHECK: call void @__kmpc_for_static_init_4( |
138 | // CHECK: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[PAR_OUTL1:.+]] to |
139 | // CHECK: call void @__kmpc_for_static_fini( |
140 | // CHECK: ret void |
141 | |
142 | // CHECK: define internal void @[[PAR_OUTL1]]({{.+}}) |
143 | // Skip global, bound tid and loop vars |
144 | // CHECK: {{.+}} = alloca i32*, |
145 | // CHECK: {{.+}} = alloca i32*, |
146 | // CHECK: {{.+}} = alloca i{{[0-9]+}}, |
147 | // CHECK: {{.+}} = alloca i{{[0-9]+}}, |
148 | // CHECK: {{%.+}} = alloca [2 x i{{[0-9]+}}]*, |
149 | // CHECK: [[X_ADDR:%.+]] = alloca i{{[0-9]+}}*, |
150 | // CHECK: {{.+}} = alloca i32, |
151 | // CHECK: {{.+}} = alloca i32, |
152 | // CHECK: {{.+}} = alloca i32, |
153 | // CHECK: {{.+}} = alloca i32, |
154 | // CHECK: {{.+}} = alloca i32, |
155 | |
156 | // CHECK: [[X_REF:%.+]] = load {{.+}}, {{.+}} [[X_ADDR]], |
157 | // CHECK: call void @__kmpc_for_static_init_4( |
158 | // CHECK: [[X_VAL:%.+]] = load {{.+}}, {{.+}} [[X_REF]], |
159 | // CHECK: store {{.+}} [[X_VAL]], |
160 | // CHECK: call void @__kmpc_for_static_fini( |
161 | // CHECK: ret void |
162 | |
163 | // CHECK: define{{.*}} i{{[0-9]+}} @[[TMAIN_INT]]() |
164 | // CHECK: call i32 @__tgt_target_teams( |
165 | // CHECK: call void @[[TOFFL1:.+]]( |
166 | // CHECK: ret |
167 | |
168 | // CHECK: define {{.*}}void @[[TOFFL1]]( |
169 | // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 {{.+}}, {{.+}} @[[TOUTL1:.+]] to {{.+}}) |
170 | // CHECK: ret void |
171 | |
172 | // CHECK: define internal void @[[TOUTL1]]({{.+}}) |
173 | // Skip global, bound tid and loop vars |
174 | // CHECK: {{.+}} = alloca i32*, |
175 | // CHECK: {{.+}} = alloca i32*, |
176 | // CHECK: alloca i{{[0-9]+}}, |
177 | // CHECK: alloca i{{[0-9]+}}, |
178 | // CHECK: alloca i{{[0-9]+}}, |
179 | // CHECK: alloca i{{[0-9]+}}, |
180 | // CHECK: alloca i{{[0-9]+}}, |
181 | |
182 | // CHECK: call void @__kmpc_for_static_init_4( |
183 | // CHECK: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[TPAR_OUTL1:.+]] to |
184 | // CHECK: call void @__kmpc_for_static_fini( |
185 | // CHECK: ret void |
186 | |
187 | // CHECK: define internal void @[[TPAR_OUTL1]]({{.+}}) |
188 | // Skip global, bound tid and loop vars |
189 | // CHECK: {{.+}} = alloca i32*, |
190 | // CHECK: {{.+}} = alloca i32*, |
191 | // prev lb and ub |
192 | // CHECK: alloca i{{[0-9]+}}, |
193 | // CHECK: alloca i{{[0-9]+}}, |
194 | |
195 | // CHECK: {{%.+}} = alloca [2 x i{{[0-9]+}}]*, |
196 | // CHECK: [[X_ADDR:%.+]] = alloca i{{[0-9]+}}*, |
197 | // iter variables |
198 | // CHECK: alloca i{{[0-9]+}}, |
199 | // CHECK: alloca i{{[0-9]+}}, |
200 | // CHECK: alloca i{{[0-9]+}}, |
201 | // CHECK: alloca i{{[0-9]+}}, |
202 | // CHECK: alloca i{{[0-9]+}}, |
203 | |
204 | // CHECK: [[X_REF:%.+]] = load {{.+}}, {{.+}} [[X_ADDR]], |
205 | // CHECK: call void @__kmpc_for_static_init_4( |
206 | // CHECK: [[X_VAL:%.+]] = load {{.+}}, {{.+}} [[X_REF]], |
207 | // CHECK: store {{.+}} [[X_VAL]], |
208 | // CHECK: call void @__kmpc_for_static_fini( |
209 | // CHECK: ret void |
210 | |
211 | |
212 | #endif |
213 | |