1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
2*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
3*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix=CHECK %s
4*0a6a1f1dSLionel Sambuc // expected-no-diagnostics
5*0a6a1f1dSLionel Sambuc #ifndef HEADER
6*0a6a1f1dSLionel Sambuc #define HEADER
7*0a6a1f1dSLionel Sambuc
8*0a6a1f1dSLionel Sambuc void fn1();
9*0a6a1f1dSLionel Sambuc void fn2();
10*0a6a1f1dSLionel Sambuc void fn3();
11*0a6a1f1dSLionel Sambuc void fn4();
12*0a6a1f1dSLionel Sambuc void fn5();
13*0a6a1f1dSLionel Sambuc void fn6();
14*0a6a1f1dSLionel Sambuc
15*0a6a1f1dSLionel Sambuc int Arg;
16*0a6a1f1dSLionel Sambuc
17*0a6a1f1dSLionel Sambuc // CHECK-LABEL: define void @{{.+}}gtid_test
gtid_test()18*0a6a1f1dSLionel Sambuc void gtid_test() {
19*0a6a1f1dSLionel Sambuc // CHECK: call void {{.+}}* @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 1, {{.+}}* [[GTID_TEST_REGION1:@.+]] to void
20*0a6a1f1dSLionel Sambuc #pragma omp parallel
21*0a6a1f1dSLionel Sambuc #pragma omp parallel if (false)
22*0a6a1f1dSLionel Sambuc gtid_test();
23*0a6a1f1dSLionel Sambuc // CHECK: ret void
24*0a6a1f1dSLionel Sambuc }
25*0a6a1f1dSLionel Sambuc
26*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[GTID_TEST_REGION1]](i{{.+}}* [[GTID_PARAM:%.+]], i
27*0a6a1f1dSLionel Sambuc // CHECK: store i{{[0-9]+}}* [[GTID_PARAM]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]],
28*0a6a1f1dSLionel Sambuc // CHECK: [[GTID_ADDR:%.+]] = load i{{[0-9]+}}** [[GTID_ADDR_REF]]
29*0a6a1f1dSLionel Sambuc // CHECK: [[GTID:%.+]] = load i{{[0-9]+}}* [[GTID_ADDR]]
30*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]])
31*0a6a1f1dSLionel Sambuc // CHECK: [[GTID_ADDR:%.+]] = load i{{[0-9]+}}** [[GTID_ADDR_REF]]
32*0a6a1f1dSLionel Sambuc // CHECK: call void [[GTID_TEST_REGION2:@.+]](i{{[0-9]+}}* [[GTID_ADDR]]
33*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]])
34*0a6a1f1dSLionel Sambuc // CHECK: ret void
35*0a6a1f1dSLionel Sambuc
36*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[GTID_TEST_REGION2]](
37*0a6a1f1dSLionel Sambuc // CHECK: call void @{{.+}}gtid_test
38*0a6a1f1dSLionel Sambuc // CHECK: ret void
39*0a6a1f1dSLionel Sambuc
40*0a6a1f1dSLionel Sambuc template <typename T>
tmain(T Arg)41*0a6a1f1dSLionel Sambuc int tmain(T Arg) {
42*0a6a1f1dSLionel Sambuc #pragma omp parallel if (true)
43*0a6a1f1dSLionel Sambuc fn1();
44*0a6a1f1dSLionel Sambuc #pragma omp parallel if (false)
45*0a6a1f1dSLionel Sambuc fn2();
46*0a6a1f1dSLionel Sambuc #pragma omp parallel if (Arg)
47*0a6a1f1dSLionel Sambuc fn3();
48*0a6a1f1dSLionel Sambuc return 0;
49*0a6a1f1dSLionel Sambuc }
50*0a6a1f1dSLionel Sambuc
51*0a6a1f1dSLionel Sambuc // CHECK-LABEL: define {{.*}}i{{[0-9]+}} @main()
main()52*0a6a1f1dSLionel Sambuc int main() {
53*0a6a1f1dSLionel Sambuc // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
54*0a6a1f1dSLionel Sambuc // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 1, void {{.+}}* [[CAP_FN4:@.+]] to void
55*0a6a1f1dSLionel Sambuc #pragma omp parallel if (true)
56*0a6a1f1dSLionel Sambuc fn4();
57*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
58*0a6a1f1dSLionel Sambuc // CHECK: store i32 [[GTID]], i32* [[GTID_ADDR:%.+]],
59*0a6a1f1dSLionel Sambuc // CHECK: call void [[CAP_FN5:@.+]](i32* [[GTID_ADDR]],
60*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
61*0a6a1f1dSLionel Sambuc #pragma omp parallel if (false)
62*0a6a1f1dSLionel Sambuc fn5();
63*0a6a1f1dSLionel Sambuc
64*0a6a1f1dSLionel Sambuc // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
65*0a6a1f1dSLionel Sambuc // CHECK: [[OMP_THEN]]
66*0a6a1f1dSLionel Sambuc // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 1, void {{.+}}* [[CAP_FN6:@.+]] to void
67*0a6a1f1dSLionel Sambuc // CHECK: br label %[[OMP_END:.+]]
68*0a6a1f1dSLionel Sambuc // CHECK: [[OMP_ELSE]]
69*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
70*0a6a1f1dSLionel Sambuc // CHECK: store i32 [[GTID]], i32* [[GTID_ADDR:%.+]],
71*0a6a1f1dSLionel Sambuc // CHECK: call void [[CAP_FN6]](i32* [[GTID_ADDR]],
72*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
73*0a6a1f1dSLionel Sambuc // CHECK: br label %[[OMP_END]]
74*0a6a1f1dSLionel Sambuc // CHECK: [[OMP_END]]
75*0a6a1f1dSLionel Sambuc #pragma omp parallel if (Arg)
76*0a6a1f1dSLionel Sambuc fn6();
77*0a6a1f1dSLionel Sambuc // CHECK: = call {{.*}}i{{.+}} @{{.+}}tmain
78*0a6a1f1dSLionel Sambuc return tmain(Arg);
79*0a6a1f1dSLionel Sambuc }
80*0a6a1f1dSLionel Sambuc
81*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[CAP_FN4]]
82*0a6a1f1dSLionel Sambuc // CHECK: call void @{{.+}}fn4
83*0a6a1f1dSLionel Sambuc // CHECK: ret void
84*0a6a1f1dSLionel Sambuc
85*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[CAP_FN5]]
86*0a6a1f1dSLionel Sambuc // CHECK: call void @{{.+}}fn5
87*0a6a1f1dSLionel Sambuc // CHECK: ret void
88*0a6a1f1dSLionel Sambuc
89*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[CAP_FN6]]
90*0a6a1f1dSLionel Sambuc // CHECK: call void @{{.+}}fn6
91*0a6a1f1dSLionel Sambuc // CHECK: ret void
92*0a6a1f1dSLionel Sambuc
93*0a6a1f1dSLionel Sambuc // CHECK-LABEL: define {{.+}} @{{.+}}tmain
94*0a6a1f1dSLionel Sambuc // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
95*0a6a1f1dSLionel Sambuc // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 1, void {{.+}}* [[CAP_FN1:@.+]] to void
96*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
97*0a6a1f1dSLionel Sambuc // CHECK: store i32 [[GTID]], i32* [[GTID_ADDR:%.+]],
98*0a6a1f1dSLionel Sambuc // CHECK: call void [[CAP_FN2:@.+]](i32* [[GTID_ADDR]],
99*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
100*0a6a1f1dSLionel Sambuc // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
101*0a6a1f1dSLionel Sambuc // CHECK: [[OMP_THEN]]
102*0a6a1f1dSLionel Sambuc // CHECK: call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 1, void {{.+}}* [[CAP_FN3:@.+]] to void
103*0a6a1f1dSLionel Sambuc // CHECK: br label %[[OMP_END:.+]]
104*0a6a1f1dSLionel Sambuc // CHECK: [[OMP_ELSE]]
105*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
106*0a6a1f1dSLionel Sambuc // CHECK: store i32 [[GTID]], i32* [[GTID_ADDR:%.+]],
107*0a6a1f1dSLionel Sambuc // CHECK: call void [[CAP_FN3]](i32* [[GTID_ADDR]],
108*0a6a1f1dSLionel Sambuc // CHECK: call void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
109*0a6a1f1dSLionel Sambuc // CHECK: br label %[[OMP_END]]
110*0a6a1f1dSLionel Sambuc // CHECK: [[OMP_END]]
111*0a6a1f1dSLionel Sambuc
112*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[CAP_FN1]]
113*0a6a1f1dSLionel Sambuc // CHECK: call void @{{.+}}fn1
114*0a6a1f1dSLionel Sambuc // CHECK: ret void
115*0a6a1f1dSLionel Sambuc
116*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[CAP_FN2]]
117*0a6a1f1dSLionel Sambuc // CHECK: call void @{{.+}}fn2
118*0a6a1f1dSLionel Sambuc // CHECK: ret void
119*0a6a1f1dSLionel Sambuc
120*0a6a1f1dSLionel Sambuc // CHECK: define internal void [[CAP_FN3]]
121*0a6a1f1dSLionel Sambuc // CHECK: call void @{{.+}}fn3
122*0a6a1f1dSLionel Sambuc // CHECK: ret void
123*0a6a1f1dSLionel Sambuc
124*0a6a1f1dSLionel Sambuc #endif
125