1*67e74705SXin Li // expected-no-diagnostics
2*67e74705SXin Li #ifndef HEADER
3*67e74705SXin Li #define HEADER
4*67e74705SXin Li // Test host codegen.
5*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-64
6*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
7*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -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 CK1 --check-prefix CK1-64
8*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-32
9*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
10*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -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 CK1 --check-prefix CK1-32
11*67e74705SXin Li #ifdef CK1
12*67e74705SXin Li
13*67e74705SXin Li int Gbla;
14*67e74705SXin Li long long Gblb;
15*67e74705SXin Li int &Gblc = Gbla;
16*67e74705SXin Li
17*67e74705SXin Li // CK1-LABEL: teams_argument_global_local
teams_argument_global_local(int a)18*67e74705SXin Li int teams_argument_global_local(int a){
19*67e74705SXin Li int comp = 1;
20*67e74705SXin Li
21*67e74705SXin Li int la = 23;
22*67e74705SXin Li float lc = 25.0;
23*67e74705SXin Li
24*67e74705SXin Li // CK1: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 1, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 0, i32 0)
25*67e74705SXin Li // CK1: call void @{{.+}}(i{{64|32}} %{{.+}})
26*67e74705SXin Li #pragma omp target
27*67e74705SXin Li #pragma omp teams
28*67e74705SXin Li {
29*67e74705SXin Li ++comp;
30*67e74705SXin Li }
31*67e74705SXin Li
32*67e74705SXin Li // CK1: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 1, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 0, i32 0)
33*67e74705SXin Li // CK1: call void @{{.+}}(i{{64|32}} %{{.+}})
34*67e74705SXin Li #pragma omp target
35*67e74705SXin Li {{{
36*67e74705SXin Li #pragma omp teams
37*67e74705SXin Li {
38*67e74705SXin Li ++comp;
39*67e74705SXin Li }
40*67e74705SXin Li }}}
41*67e74705SXin Li
42*67e74705SXin Li // CK1-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 2, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 [[NT:%[^,]+]], i32 0)
43*67e74705SXin Li // CK1-DAG: [[NT]] = load i32, i32* [[NTA:%[^,]+]],
44*67e74705SXin Li
45*67e74705SXin Li // CK1: call void @{{.+}}(i{{64|32}} %{{.+}})
46*67e74705SXin Li #pragma omp target
47*67e74705SXin Li #pragma omp teams num_teams(la)
48*67e74705SXin Li {
49*67e74705SXin Li ++comp;
50*67e74705SXin Li }
51*67e74705SXin Li
52*67e74705SXin Li // CK1-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 2, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 0, i32 [[NT:%[^,]+]])
53*67e74705SXin Li // CK1-DAG: [[NT]] = load i32, i32* [[NTA:%[^,]+]],
54*67e74705SXin Li
55*67e74705SXin Li // CK1: call void @{{.+}}(i{{64|32}} %{{.+}})
56*67e74705SXin Li #pragma omp target
57*67e74705SXin Li #pragma omp teams thread_limit(la)
58*67e74705SXin Li {
59*67e74705SXin Li ++comp;
60*67e74705SXin Li }
61*67e74705SXin Li
62*67e74705SXin Li // CK1-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 5, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 [[NT:%[^,]+]], i32 [[TL:%[^,]+]])
63*67e74705SXin Li
64*67e74705SXin Li // CK1-DAG: [[NT]] = add nsw i32 [[NTA:%[^,]+]], [[NTB:%[^,]+]]
65*67e74705SXin Li // CK1-DAG: [[NTA]] = load i32, i32* @Gbla,
66*67e74705SXin Li // CK1-DAG: [[NTB]] = load i32, i32* %{{.+}},
67*67e74705SXin Li
68*67e74705SXin Li // CK1-DAG: [[TL]] = trunc i64 [[TLA:%[^,]+]] to i32
69*67e74705SXin Li // CK1-DAG: [[TLA]] = add nsw i64 [[TLB:%[^,]+]], [[TLC:%[^,]+]]
70*67e74705SXin Li // CK1-DAG: [[TLC]] = fptosi float [[TLD:%[^,]+]] to i64
71*67e74705SXin Li // CK1-DAG: [[TLD]] = load float, float* %{{.+}},
72*67e74705SXin Li // CK1-DAG: [[TLB]] = load i64, i64* @Gblb,
73*67e74705SXin Li
74*67e74705SXin Li // CK1: call void @{{.+}}(i{{.+}} {{.+}}, i{{.+}} {{.+}}, i{{.+}} {{.+}}, i{{.+}} {{.+}}, i{{.+}} {{.+}})
75*67e74705SXin Li #pragma omp target
76*67e74705SXin Li #pragma omp teams num_teams(Gbla+a) thread_limit(Gblb+(long long)lc)
77*67e74705SXin Li {
78*67e74705SXin Li ++comp;
79*67e74705SXin Li }
80*67e74705SXin Li
81*67e74705SXin Li // CK1-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 {{.+}}, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 [[NT:%[^,]+]], i32 [[TL:%[^,]+]])
82*67e74705SXin Li
83*67e74705SXin Li // CK1-DAG: [[NT]] = add nsw i32 [[NTA:%[^,]+]], 1
84*67e74705SXin Li // CK1-DAG: [[NTA]] = load i32, i32* @Gbla,
85*67e74705SXin Li
86*67e74705SXin Li // CK1-DAG: [[TL]] = add nsw i32 [[TLA:%[^,]+]], 2
87*67e74705SXin Li // CK1-DAG: [[TLA]] = load i32, i32* @Gbla,
88*67e74705SXin Li
89*67e74705SXin Li // CK1: call void @{{.+}}(i{{.+}} {{.+}}
90*67e74705SXin Li #pragma omp target
91*67e74705SXin Li #pragma omp teams num_teams(Gblc+1) thread_limit(Gblc+2)
92*67e74705SXin Li {
93*67e74705SXin Li comp += Gblc;
94*67e74705SXin Li }
95*67e74705SXin Li
96*67e74705SXin Li return comp;
97*67e74705SXin Li }
98*67e74705SXin Li
99*67e74705SXin Li #endif // CK1
100*67e74705SXin Li
101*67e74705SXin Li // Test host codegen.
102*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-64
103*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
104*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -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 CK2 --check-prefix CK2-64
105*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-32
106*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
107*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -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 CK2 --check-prefix CK2-32
108*67e74705SXin Li #ifdef CK2
109*67e74705SXin Li
110*67e74705SXin Li // CK2-DAG: [[SSI:%.+]] = type { i32, float }
111*67e74705SXin Li // CK2-DAG: [[SSL:%.+]] = type { i64, float }
112*67e74705SXin Li template <typename T>
113*67e74705SXin Li struct SS{
114*67e74705SXin Li T a;
115*67e74705SXin Li float b;
116*67e74705SXin Li };
117*67e74705SXin Li
118*67e74705SXin Li SS<int> Gbla;
119*67e74705SXin Li SS<long long> Gblb;
120*67e74705SXin Li
121*67e74705SXin Li // CK2-LABEL: teams_template_arg
teams_template_arg(void)122*67e74705SXin Li int teams_template_arg(void) {
123*67e74705SXin Li int comp = 1;
124*67e74705SXin Li
125*67e74705SXin Li SS<int> la;
126*67e74705SXin Li SS<long long> lb;
127*67e74705SXin Li
128*67e74705SXin Li // CK2-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 3, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 [[NT:%[^,]+]], i32 [[TL:%[^,]+]])
129*67e74705SXin Li
130*67e74705SXin Li // CK2-DAG: [[NT]] = load i32, i32* getelementptr inbounds ([[SSI]], [[SSI]]* @Gbla, i32 0, i32 0)
131*67e74705SXin Li
132*67e74705SXin Li // CK2-DAG: [[TL]] = trunc i64 [[TLA:%[^,]+]] to i32
133*67e74705SXin Li // CK2-DAG: [[TLA]] = fptosi float [[TLB:%[^,]+]] to i64
134*67e74705SXin Li // CK2-DAG: [[TLB]] = load float, float* [[TLC:%[^,]+]],
135*67e74705SXin Li // CK2-DAG: [[TLC]] = getelementptr inbounds [[SSI]], [[SSI]]* %{{.+}}, i32 0, i32 1
136*67e74705SXin Li
137*67e74705SXin Li // CK2: call void @{{.+}}({{.+}} {{.+}}, {{.+}} {{.+}}, {{.+}} {{.+}})
138*67e74705SXin Li #pragma omp target
139*67e74705SXin Li #pragma omp teams num_teams(Gbla.a) thread_limit((long long)la.b)
140*67e74705SXin Li {
141*67e74705SXin Li ++comp;
142*67e74705SXin Li }
143*67e74705SXin Li
144*67e74705SXin Li // CK2-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 3, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 [[NT:%[^,]+]], i32 [[TL:%[^,]+]])
145*67e74705SXin Li
146*67e74705SXin Li // CK2-DAG: [[TL]] = trunc i64 [[TLD:%[^,]+]] to i32
147*67e74705SXin Li // CK2-DAG: [[TLD]] = load i64, i64* getelementptr inbounds ([[SSL]], [[SSL]]* @Gblb, i32 0, i32 0),
148*67e74705SXin Li
149*67e74705SXin Li // CK2-DAG: [[NT]] = trunc i64 [[NTA:%[^,]+]] to i32
150*67e74705SXin Li // CK2-DAG: [[NTA]] = fptosi float [[NTB:%[^,]+]] to i64
151*67e74705SXin Li // CK2-DAG: [[NTB]] = load float, float* [[NTC:%[^,]+]],
152*67e74705SXin Li // CK2-DAG: [[NTC]] = getelementptr inbounds [[SSL]], [[SSL]]* %{{.+}}, i32 0, i32 1
153*67e74705SXin Li
154*67e74705SXin Li // CK2: call void @{{.+}}({{.+}} {{.+}}, {{.+}} {{.+}}, {{.+}} {{.+}})
155*67e74705SXin Li #pragma omp target
156*67e74705SXin Li #pragma omp teams num_teams((long long)lb.b) thread_limit(Gblb.a)
157*67e74705SXin Li {
158*67e74705SXin Li ++comp;
159*67e74705SXin Li }
160*67e74705SXin Li return comp;
161*67e74705SXin Li }
162*67e74705SXin Li #endif // CK2
163*67e74705SXin Li
164*67e74705SXin Li // Test host codegen.
165*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64
166*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
167*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -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 CK3 --check-prefix CK3-64
168*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32
169*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
170*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -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 CK3 --check-prefix CK3-32
171*67e74705SXin Li #ifdef CK3
172*67e74705SXin Li
173*67e74705SXin Li // CK3: [[SSI:%.+]] = type { i32, float }
174*67e74705SXin Li // CK3-LABEL: teams_template_struct
175*67e74705SXin Li
176*67e74705SXin Li template <typename T, int X, long long Y>
177*67e74705SXin Li struct SS{
178*67e74705SXin Li T a;
179*67e74705SXin Li float b;
180*67e74705SXin Li
fooSS181*67e74705SXin Li int foo(void) {
182*67e74705SXin Li int comp = 1;
183*67e74705SXin Li
184*67e74705SXin Li // CK3-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 2, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 [[NT:%[^,]+]], i32 123)
185*67e74705SXin Li
186*67e74705SXin Li // CK3-DAG: [[NT]] = load i32, i32* [[NTA:%[^,]+]],
187*67e74705SXin Li // CK3-DAG: [[NTA]] = getelementptr inbounds [[SSI]], [[SSI]]* [[NTB:%[^,]+]], i32 0, i32 0
188*67e74705SXin Li // CK3-DAG: [[NTB]] = load [[SSI]]*, [[SSI]]** %{{.+}},
189*67e74705SXin Li
190*67e74705SXin Li // CK3: call void @{{.+}}({{.+}} {{.+}}, {{.+}} {{.+}})
191*67e74705SXin Li #pragma omp target
192*67e74705SXin Li #pragma omp teams num_teams(a) thread_limit(X)
193*67e74705SXin Li {
194*67e74705SXin Li ++comp;
195*67e74705SXin Li }
196*67e74705SXin Li
197*67e74705SXin Li // CK3-DAG: call i32 @__tgt_target_teams(i32 -1, i8* @{{[^,]+}}, i32 2, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 456, i32 [[TL:%[^,]+]])
198*67e74705SXin Li
199*67e74705SXin Li // CK3-DAG: [[TL]] = add nsw i32 [[TLA:%[^,]+]], 123
200*67e74705SXin Li // CK3-DAG: [[TLA]] = fptosi float [[TLB:%[^,]+]] to i32
201*67e74705SXin Li // CK3-DAG: [[TLB]] = load float, float* [[TLC:%[^,]+]],
202*67e74705SXin Li // CK3-DAG: [[TLC]] = getelementptr inbounds [[SSI]], [[SSI]]* [[THIS:%[^,]+]], i32 0, i32 1
203*67e74705SXin Li
204*67e74705SXin Li // CK3: call void @{{.+}}({{.+}} {{.+}}, {{.+}} {{.+}})
205*67e74705SXin Li #pragma omp target
206*67e74705SXin Li #pragma omp teams num_teams(Y) thread_limit((int)b+X)
207*67e74705SXin Li {
208*67e74705SXin Li ++comp;
209*67e74705SXin Li }
210*67e74705SXin Li return comp;
211*67e74705SXin Li }
212*67e74705SXin Li };
213*67e74705SXin Li
teams_template_struct(void)214*67e74705SXin Li int teams_template_struct(void) {
215*67e74705SXin Li SS<int, 123, 456> V;
216*67e74705SXin Li return V.foo();
217*67e74705SXin Li
218*67e74705SXin Li }
219*67e74705SXin Li #endif // CK3
220*67e74705SXin Li
221*67e74705SXin Li // Test target codegen - host bc file has to be created first.
222*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
223*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -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 %s --check-prefix CK4 --check-prefix CK4-64
224*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -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
225*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -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 %s --check-prefix CK4 --check-prefix CK4-64
226*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
227*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -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 %s --check-prefix CK4 --check-prefix CK4-32
228*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -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
229*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -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 %s --check-prefix CK4 --check-prefix CK4-32
230*67e74705SXin Li
231*67e74705SXin Li #ifdef CK4
232*67e74705SXin Li
233*67e74705SXin Li // CK4-DAG: %ident_t = type { i32, i32, i32, i32, i8* }
234*67e74705SXin Li // CK4-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00"
235*67e74705SXin Li // CK4-DAG: [[DEF_LOC_0:@.+]] = private unnamed_addr constant %ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) }
236*67e74705SXin Li // CK4-DEBUG-DAG: [[LOC1:@.+]] = private unnamed_addr constant [{{.+}} x i8] c";{{.*}}teams_codegen.cpp;main;[[@LINE+14]];9;;\00"
237*67e74705SXin Li // CK4-DEBUG-DAG: [[LOC2:@.+]] = private unnamed_addr constant [{{.+}} x i8] c";{{.*}}teams_codegen.cpp;tmain;[[@LINE+7]];9;;\00"
238*67e74705SXin Li
239*67e74705SXin Li template <typename T>
tmain(T argc)240*67e74705SXin Li int tmain(T argc) {
241*67e74705SXin Li #pragma omp target
242*67e74705SXin Li #pragma omp teams
243*67e74705SXin Li argc = 0;
244*67e74705SXin Li return 0;
245*67e74705SXin Li }
246*67e74705SXin Li
main(int argc,char ** argv)247*67e74705SXin Li int main (int argc, char **argv) {
248*67e74705SXin Li #pragma omp target
249*67e74705SXin Li #pragma omp teams
250*67e74705SXin Li argc = 0;
251*67e74705SXin Li return tmain(argv);
252*67e74705SXin Li }
253*67e74705SXin Li
254*67e74705SXin Li // CK4: define {{.*}}void @{{[^,]+}}(i{{.+}} %[[ARGC:.+]])
255*67e74705SXin Li // CK4: [[ARGCADDR:%.+]] = alloca i{{.+}}
256*67e74705SXin Li // CK4: store i{{.+}} %[[ARGC]], i{{.+}}* [[ARGCADDR]]
257*67e74705SXin Li // CK4-64: [[CONV:%.+]] = bitcast i64* [[ARGCADDR]] to i32*
258*67e74705SXin Li // CK4-64: call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%ident_t* [[DEF_LOC_0]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* {{.+}} to void (i32*, i32*, ...)*), i32* [[CONV]])
259*67e74705SXin Li // CK4-32: call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%ident_t* [[DEF_LOC_0]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* {{.+}} to void (i32*, i32*, ...)*), i32* [[ARGCADDR]])
260*67e74705SXin Li // CK4: ret void
261*67e74705SXin Li // CK4-NEXT: }
262*67e74705SXin Li
263*67e74705SXin Li // CK4: define {{.*}}void @{{[^,]+}}(i8** [[ARGC1:%.+]])
264*67e74705SXin Li // CK4: [[ARGCADDR1:%.+]] = alloca i8**
265*67e74705SXin Li // CK4: store i8** [[ARGC1]], i8*** [[ARGCADDR1]]
266*67e74705SXin Li // CK4: call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%ident_t* [[DEF_LOC_0]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i8***)* {{.+}} to void (i32*, i32*, ...)*), i8*** [[ARGCADDR1]])
267*67e74705SXin Li
268*67e74705SXin Li
269*67e74705SXin Li #endif // CK4
270*67e74705SXin Li
271*67e74705SXin Li // Test target codegen - host bc file has to be created first.
272*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
273*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -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 %s --check-prefix CK5 --check-prefix CK5-64
274*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -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
275*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -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 %s --check-prefix CK5 --check-prefix CK5-64
276*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
277*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -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 %s --check-prefix CK5 --check-prefix CK5-32
278*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -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
279*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -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 %s --check-prefix CK5 --check-prefix CK5-32
280*67e74705SXin Li
281*67e74705SXin Li // expected-no-diagnostics
282*67e74705SXin Li #ifdef CK5
283*67e74705SXin Li
284*67e74705SXin Li // CK5-DAG: %ident_t = type { i32, i32, i32, i32, i8* }
285*67e74705SXin Li // CK5-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00"
286*67e74705SXin Li // CK5-DAG: [[DEF_LOC_0:@.+]] = private unnamed_addr constant %ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* [[STR]], i32 0, i32 0) }
287*67e74705SXin Li // CK5-DEBUG-DAG: [[LOC1:@.+]] = private unnamed_addr constant [{{.+}} x i8] c";{{.*}}teams_codegen.cpp;main;[[@LINE+14]];9;;\00"
288*67e74705SXin Li // CK5-DEBUG-DAG: [[LOC2:@.+]] = private unnamed_addr constant [{{.+}} x i8] c";{{.*}}teams_codegen.cpp;tmain;[[@LINE+7]];9;;\00"
289*67e74705SXin Li
290*67e74705SXin Li template <typename T>
tmain(T argc)291*67e74705SXin Li int tmain(T argc) {
292*67e74705SXin Li int a = 10;
293*67e74705SXin Li int b = 5;
294*67e74705SXin Li #pragma omp target
295*67e74705SXin Li #pragma omp teams num_teams(a) thread_limit(b)
296*67e74705SXin Li {
297*67e74705SXin Li argc = 0;
298*67e74705SXin Li }
299*67e74705SXin Li return 0;
300*67e74705SXin Li }
301*67e74705SXin Li
main(int argc,char ** argv)302*67e74705SXin Li int main (int argc, char **argv) {
303*67e74705SXin Li int a = 20;
304*67e74705SXin Li int b = 5;
305*67e74705SXin Li #pragma omp target
306*67e74705SXin Li #pragma omp teams num_teams(a) thread_limit(b)
307*67e74705SXin Li {
308*67e74705SXin Li argc = 0;
309*67e74705SXin Li }
310*67e74705SXin Li return tmain(argv);
311*67e74705SXin Li }
312*67e74705SXin Li
313*67e74705SXin Li // CK5: define {{.*}}void @{{[^,]+}}(i{{.+}} [[AP:%.+]], i{{.+}} [[BP:%.+]], i{{.+}} [[ARGC:.+]])
314*67e74705SXin Li // CK5: [[AADDR:%.+]] = alloca i{{.+}}
315*67e74705SXin Li // CK5: [[BADDR:%.+]] = alloca i{{.+}}
316*67e74705SXin Li // CK5: [[ARGCADDR:%.+]] = alloca i{{.+}}
317*67e74705SXin Li // CK5: [[GBL_TH_NUM:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* [[DEF_LOC_0]])
318*67e74705SXin Li // CK5: store i{{.+}} [[AP]], i{{.+}}* [[AADDR]]
319*67e74705SXin Li // CK5: store i{{.+}} [[BP]], i{{.+}}* [[BADDR]]
320*67e74705SXin Li // CK5: store i{{.+}} [[ARGC]], i{{.+}}* [[ARGCADDR]]
321*67e74705SXin Li // CK5-64: [[ACONV:%.+]] = bitcast i64* [[AADDR]] to i32*
322*67e74705SXin Li // CK5-64: [[BCONV:%.+]] = bitcast i64* [[BADDR]] to i32*
323*67e74705SXin Li // CK5-64: [[CONV:%.+]] = bitcast i64* [[ARGCADDR]] to i32*
324*67e74705SXin Li // CK5-64: [[ACONVVAL:%.+]] = load i32, i32* [[ACONV]]
325*67e74705SXin Li // CK5-64: [[BCONVVAL:%.+]] = load i32, i32* [[BCONV]]
326*67e74705SXin Li // CK5-32: [[ACONVVAL:%.+]] = load i32, i32* [[AADDR]]
327*67e74705SXin Li // CK5-32: [[BCONVVAL:%.+]] = load i32, i32* [[BADDR]]
328*67e74705SXin Li // CK5: {{.+}} = call i32 @__kmpc_push_num_teams(%ident_t* [[DEF_LOC_0]], i32 [[GBL_TH_NUM]], i32 [[ACONVVAL]], i32 [[BCONVVAL]])
329*67e74705SXin Li // CK5-64: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%ident_t* [[DEF_LOC_0]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[CONV]])
330*67e74705SXin Li // CK5-32: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%ident_t* [[DEF_LOC_0]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[ARGCADDR]])
331*67e74705SXin Li
332*67e74705SXin Li // CK5: define {{.*}}void @{{[^,]+}}(i{{.+}} [[AP:%.+]], i{{.+}} [[BP:%.+]], i{{.+}}** [[ARGC:%.+]])
333*67e74705SXin Li // CK5: [[AADDR:%.+]] = alloca i{{.+}}
334*67e74705SXin Li // CK5: [[BADDR:%.+]] = alloca i{{.+}}
335*67e74705SXin Li // CK5: [[ARGCADDR:%.+]] = alloca i{{.+}}**
336*67e74705SXin Li // CK5: [[GBL_TH_NUM:%.+]] = call i32 @__kmpc_global_thread_num(%ident_t* [[DEF_LOC_0]])
337*67e74705SXin Li // CK5: store i{{.+}} [[AP]], i{{.+}}* [[AADDR]]
338*67e74705SXin Li // CK5: store i{{.+}} [[BP]], i{{.+}}* [[BADDR]]
339*67e74705SXin Li // CK5: store i{{.+}}** [[ARGC]], i{{.+}}*** [[ARGCADDR]]
340*67e74705SXin Li // CK5-64: [[ACONV:%.+]] = bitcast i64* [[AADDR]] to i32*
341*67e74705SXin Li // CK5-64: [[BCONV:%.+]] = bitcast i64* [[BADDR]] to i32*
342*67e74705SXin Li // CK5-64: [[ACONVVAL:%.+]] = load i32, i32* [[ACONV]]
343*67e74705SXin Li // CK5-64: [[BCONVVAL:%.+]] = load i32, i32* [[BCONV]]
344*67e74705SXin Li // CK5-64: {{.+}} = call i32 @__kmpc_push_num_teams(%ident_t* [[DEF_LOC_0]], i32 [[GBL_TH_NUM]], i32 [[ACONVVAL]], i32 [[BCONVVAL]])
345*67e74705SXin Li // CK5-32: [[A_VAL:%.+]] = load i32, i32* [[AADDR]]
346*67e74705SXin Li // CK5-32: [[B_VAL:%.+]] = load i32, i32* [[BADDR]]
347*67e74705SXin Li // CK5-32: {{.+}} = call i32 @__kmpc_push_num_teams(%ident_t* [[DEF_LOC_0]], i32 [[GBL_TH_NUM]], i32 [[A_VAL]], i32 [[B_VAL]])
348*67e74705SXin Li // CK5: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%ident_t* [[DEF_LOC_0]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i{{.+}})* @.omp_outlined.{{.+}} to void (i32*, i32*, ...)*), i{{.+}}*** [[ARGCADDR]])
349*67e74705SXin Li // CK5: ret void
350*67e74705SXin Li // CK5-NEXT: }
351*67e74705SXin Li
352*67e74705SXin Li #endif // CK5
353*67e74705SXin Li #endif
354