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