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