xref: /aosp_15_r20/external/clang/test/OpenMP/task_if_codegen.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4*67e74705SXin Li // REQUIRES: x86-registered-target
5*67e74705SXin Li // expected-no-diagnostics
6*67e74705SXin Li #ifndef HEADER
7*67e74705SXin Li #define HEADER
8*67e74705SXin Li 
9*67e74705SXin Li void fn1();
10*67e74705SXin Li void fn2();
11*67e74705SXin Li void fn3();
12*67e74705SXin Li void fn4();
13*67e74705SXin Li void fn5();
14*67e74705SXin Li void fn6();
15*67e74705SXin Li void fn7();
16*67e74705SXin Li void fn8();
17*67e74705SXin Li void fn9();
18*67e74705SXin Li void fn10();
19*67e74705SXin Li 
20*67e74705SXin Li int Arg;
21*67e74705SXin Li 
22*67e74705SXin Li // CHECK-LABEL: define void @{{.+}}gtid_test
gtid_test()23*67e74705SXin Li void gtid_test() {
24*67e74705SXin Li // CHECK:  call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, {{.+}}* [[GTID_TEST_REGION1:@.+]] to void
25*67e74705SXin Li #pragma omp parallel
26*67e74705SXin Li #pragma omp task if (task: false)
27*67e74705SXin Li   gtid_test();
28*67e74705SXin Li // CHECK: ret void
29*67e74705SXin Li }
30*67e74705SXin Li 
31*67e74705SXin Li // CHECK: define internal void [[GTID_TEST_REGION1]](i32* noalias [[GTID_PARAM:%.+]], i
32*67e74705SXin Li // CHECK: store i32* [[GTID_PARAM]], i32** [[GTID_ADDR_REF:%.+]],
33*67e74705SXin Li // CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_REF]]
34*67e74705SXin Li // CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]]
35*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(
36*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
37*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
38*67e74705SXin Li // CHECK: call i32 [[GTID_TEST_REGION2:@.+]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
39*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
40*67e74705SXin Li // CHECK: ret void
41*67e74705SXin Li 
42*67e74705SXin Li // CHECK: define internal i32 [[GTID_TEST_REGION2]](
43*67e74705SXin Li // CHECK: call void @{{.+}}gtid_test
44*67e74705SXin Li // CHECK: ret i32
45*67e74705SXin Li 
46*67e74705SXin Li template <typename T>
tmain(T Arg)47*67e74705SXin Li int tmain(T Arg) {
48*67e74705SXin Li #pragma omp task if (task: true)
49*67e74705SXin Li   fn1();
50*67e74705SXin Li #pragma omp task if (false)
51*67e74705SXin Li   fn2();
52*67e74705SXin Li #pragma omp task if (Arg)
53*67e74705SXin Li   fn3();
54*67e74705SXin Li #pragma omp task if (task: Arg) depend(in : Arg)
55*67e74705SXin Li   fn4();
56*67e74705SXin Li #pragma omp task if (Arg) depend(out : Arg)
57*67e74705SXin Li   fn5();
58*67e74705SXin Li #pragma omp task if (Arg) depend(inout : Arg)
59*67e74705SXin Li   fn6();
60*67e74705SXin Li   return 0;
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li // CHECK-LABEL: @main
main()64*67e74705SXin Li int main() {
65*67e74705SXin Li // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
66*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN7:[^ ]+]] to i32 (i32, i8*)*))
67*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
68*67e74705SXin Li #pragma omp task if (true)
69*67e74705SXin Li   fn7();
70*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN8:[^ ]+]] to i32 (i32, i8*)*))
71*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
72*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
73*67e74705SXin Li // CHECK: call i32 [[CAP_FN8]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
74*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
75*67e74705SXin Li #pragma omp task if (false)
76*67e74705SXin Li   fn8();
77*67e74705SXin Li 
78*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN9:[^ ]+]] to i32 (i32, i8*)*))
79*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
80*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
81*67e74705SXin Li // CHECK: [[OMP_THEN]]
82*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
83*67e74705SXin Li // CHECK: br label %[[OMP_END:.+]]
84*67e74705SXin Li // CHECK: [[OMP_ELSE]]
85*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
86*67e74705SXin Li // CHECK: call i32 [[CAP_FN9]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
87*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
88*67e74705SXin Li // CHECK: br label %[[OMP_END]]
89*67e74705SXin Li // CHECK: [[OMP_END]]
90*67e74705SXin Li #pragma omp task if (Arg)
91*67e74705SXin Li   fn9();
92*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN10:[^ ]+]] to i32 (i32, i8*)*))
93*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
94*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
95*67e74705SXin Li // CHECK: [[OMP_THEN]]
96*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%[^,]+]], i32 0, i8* null)
97*67e74705SXin Li // CHECK: br label %[[OMP_END:.+]]
98*67e74705SXin Li // CHECK: [[OMP_ELSE]]
99*67e74705SXin Li // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
100*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
101*67e74705SXin Li // CHECK: call i32 [[CAP_FN10]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
102*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
103*67e74705SXin Li // CHECK: br label %[[OMP_END]]
104*67e74705SXin Li // CHECK: [[OMP_END]]
105*67e74705SXin Li #pragma omp task if (Arg) depend(inout : Arg)
106*67e74705SXin Li   fn10();
107*67e74705SXin Li   // CHECK: = call {{.*}}i{{.+}} @{{.+}}tmain
108*67e74705SXin Li   return tmain(Arg);
109*67e74705SXin Li }
110*67e74705SXin Li 
111*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN7]]
112*67e74705SXin Li // CHECK: call void @{{.+}}fn7
113*67e74705SXin Li // CHECK: ret i32
114*67e74705SXin Li 
115*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN8]]
116*67e74705SXin Li // CHECK: call void @{{.+}}fn8
117*67e74705SXin Li // CHECK: ret i32
118*67e74705SXin Li 
119*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN9]]
120*67e74705SXin Li // CHECK: call void @{{.+}}fn9
121*67e74705SXin Li // CHECK: ret i32
122*67e74705SXin Li 
123*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN10]]
124*67e74705SXin Li // CHECK: call void @{{.+}}fn10
125*67e74705SXin Li // CHECK: ret i32
126*67e74705SXin Li 
127*67e74705SXin Li // CHECK-LABEL: define {{.+}} @{{.+}}tmain
128*67e74705SXin Li // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
129*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32,  %{{[^*]+}}*)* [[CAP_FN1:[^ ]+]] to i32 (i32, i8*)*))
130*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
131*67e74705SXin Li 
132*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(
133*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
134*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
135*67e74705SXin Li // CHECK: call i32 [[CAP_FN2:@.+]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
136*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
137*67e74705SXin Li 
138*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN3:[^ ]+]] to i32 (i32, i8*)*))
139*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
140*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
141*67e74705SXin Li // CHECK: [[OMP_THEN]]
142*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
143*67e74705SXin Li // CHECK: br label %[[OMP_END:.+]]
144*67e74705SXin Li // CHECK: [[OMP_ELSE]]
145*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
146*67e74705SXin Li // CHECK: call i32 [[CAP_FN3]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
147*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
148*67e74705SXin Li // CHECK: br label %[[OMP_END]]
149*67e74705SXin Li // CHECK: [[OMP_END]]
150*67e74705SXin Li 
151*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN4:[^ ]+]] to i32 (i32, i8*)*))
152*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
153*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
154*67e74705SXin Li // CHECK: [[OMP_THEN]]
155*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%.+]], i32 0, i8* null)
156*67e74705SXin Li // CHECK: br label %[[OMP_END:.+]]
157*67e74705SXin Li // CHECK: [[OMP_ELSE]]
158*67e74705SXin Li // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
159*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
160*67e74705SXin Li // CHECK: call i32 [[CAP_FN4]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
161*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
162*67e74705SXin Li // CHECK: br label %[[OMP_END]]
163*67e74705SXin Li // CHECK: [[OMP_END]]
164*67e74705SXin Li 
165*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN5:[^ ]+]] to i32 (i32, i8*)*))
166*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
167*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
168*67e74705SXin Li // CHECK: [[OMP_THEN]]
169*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%.+]], i32 0, i8* null)
170*67e74705SXin Li // CHECK: br label %[[OMP_END:.+]]
171*67e74705SXin Li // CHECK: [[OMP_ELSE]]
172*67e74705SXin Li // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
173*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
174*67e74705SXin Li // CHECK: call i32 [[CAP_FN5]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
175*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
176*67e74705SXin Li // CHECK: br label %[[OMP_END]]
177*67e74705SXin Li // CHECK: [[OMP_END]]
178*67e74705SXin Li 
179*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN6:[^ ]+]] to i32 (i32, i8*)*))
180*67e74705SXin Li // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
181*67e74705SXin Li // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
182*67e74705SXin Li // CHECK: [[OMP_THEN]]
183*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%.+]], i32 0, i8* null)
184*67e74705SXin Li // CHECK: br label %[[OMP_END:.+]]
185*67e74705SXin Li // CHECK: [[OMP_ELSE]]
186*67e74705SXin Li // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
187*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
188*67e74705SXin Li // CHECK: call i32 [[CAP_FN6]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
189*67e74705SXin Li // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
190*67e74705SXin Li // CHECK: br label %[[OMP_END]]
191*67e74705SXin Li // CHECK: [[OMP_END]]
192*67e74705SXin Li 
193*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN1]]
194*67e74705SXin Li // CHECK: call void @{{.+}}fn1
195*67e74705SXin Li // CHECK: ret i32
196*67e74705SXin Li 
197*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN2]]
198*67e74705SXin Li // CHECK: call void @{{.+}}fn2
199*67e74705SXin Li // CHECK: ret i32
200*67e74705SXin Li 
201*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN3]]
202*67e74705SXin Li // CHECK: call void @{{.+}}fn3
203*67e74705SXin Li // CHECK: ret i32
204*67e74705SXin Li 
205*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN4]]
206*67e74705SXin Li // CHECK: call void @{{.+}}fn4
207*67e74705SXin Li // CHECK: ret i32
208*67e74705SXin Li 
209*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN5]]
210*67e74705SXin Li // CHECK: call void @{{.+}}fn5
211*67e74705SXin Li // CHECK: ret i32
212*67e74705SXin Li 
213*67e74705SXin Li // CHECK: define internal i32 [[CAP_FN6]]
214*67e74705SXin Li // CHECK: call void @{{.+}}fn6
215*67e74705SXin Li // CHECK: ret i32
216*67e74705SXin Li 
217*67e74705SXin Li #endif
218