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