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
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
22 // CHECK-LABEL: define {{.*}}void @{{.+}}gtid_test
24 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, {{.+}}* [[GTID_TEST_REGION1:@.+]] to void
26 #pragma omp parallel if (parallel: false)
31 // CHECK: define internal {{.*}}void [[GTID_TEST_REGION1]](i{{.+}}* noalias [[GTID_PARAM:%.+]], i32* noalias
32 // CHECK: store i32 0, i32* [[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: call void [[GTID_TEST_REGION2:@.+]](i{{[0-9]+}}* [[ZERO_ADDR]]
38 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]])
41 // CHECK: define internal {{.*}}void [[GTID_TEST_REGION2]](
42 // CHECK: call {{.*}}void @{{.+}}gtid_test
47 #pragma omp parallel if (true)
49 #pragma omp parallel if (false)
51 #pragma omp parallel if (parallel: Arg)
56 // CHECK-LABEL: define {{.*}}i{{[0-9]+}} @main()
58 // CHECK: store i32 0, i32* [[ZERO_ADDR2:%.+]],
59 // CHECK: store i32 0, i32* [[ZERO_ADDR1:%.+]],
60 // CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num(
61 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN4:@.+]] to void
62 #pragma omp parallel if (true)
64 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
65 // CHECK: call void [[CAP_FN5:@.+]](i32* [[ZERO_ADDR1]], i32* [[ZERO_ADDR1]])
66 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
67 #pragma omp parallel if (false)
70 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
71 // CHECK: [[OMP_THEN]]
72 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN6:@.+]] to void
73 // CHECK: br label %[[OMP_END:.+]]
74 // CHECK: [[OMP_ELSE]]
75 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
76 // CHECK: call void [[CAP_FN6]](i32* [[ZERO_ADDR2]], i32* [[ZERO_ADDR2]])
77 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
78 // CHECK: br label %[[OMP_END]]
80 #pragma omp parallel if (Arg)
82 // CHECK: = call {{.*}}i{{.+}} @{{.+}}tmain
86 // CHECK: define internal {{.*}}void [[CAP_FN4]]
87 // CHECK: call {{.*}}void @{{.+}}fn4
90 // CHECK: define internal {{.*}}void [[CAP_FN5]]
91 // CHECK: call {{.*}}void @{{.+}}fn5
94 // CHECK: define internal {{.*}}void [[CAP_FN6]]
95 // CHECK: call {{.*}}void @{{.+}}fn6
98 // CHECK-LABEL: define {{.+}} @{{.+}}tmain
99 // CHECK: store i32 0, i32* [[ZERO_ADDR2:%.+]],
100 // CHECK: store i32 0, i32* [[ZERO_ADDR1:%.+]],
101 // CHECK: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num(
102 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN1:@.+]] to void
103 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
104 // CHECK: call void [[CAP_FN2:@.+]](i32* [[ZERO_ADDR1]], i32* [[ZERO_ADDR1]])
105 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
106 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
107 // CHECK: [[OMP_THEN]]
108 // CHECK: call {{.*}}void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, void {{.+}}* [[CAP_FN3:@.+]] to void
109 // CHECK: br label %[[OMP_END:.+]]
110 // CHECK: [[OMP_ELSE]]
111 // CHECK: call {{.*}}void @__kmpc_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
112 // CHECK: call void [[CAP_FN3]](i32* [[ZERO_ADDR2]], i32* [[ZERO_ADDR2]])
113 // CHECK: call {{.*}}void @__kmpc_end_serialized_parallel(%{{.+}}* @{{.+}}, i32 [[GTID]])
114 // CHECK: br label %[[OMP_END]]
115 // CHECK: [[OMP_END]]
117 // CHECK: define internal {{.*}}void [[CAP_FN1]]
118 // CHECK: call {{.*}}void @{{.+}}fn1
121 // CHECK: define internal {{.*}}void [[CAP_FN2]]
122 // CHECK: call {{.*}}void @{{.+}}fn2
125 // CHECK: define internal {{.*}}void [[CAP_FN3]]
126 // CHECK: call {{.*}}void @{{.+}}fn3