1 // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=50 -x c -emit-llvm %s -o - | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fopenmp-version=50 -x c -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s 6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c -triple x86_64-apple-darwin10 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c -triple x86_64-apple-darwin10 -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 typedef void *omp_depend_t; 14 typedef __UINTPTR_TYPE__ omp_event_handle_t; 15 16 void foo(); 17 18 // CHECK-LABEL: @main 19 int main() { 20 omp_depend_t d, x; 21 omp_event_handle_t evt; 22 int a, *b; 23 // CHECK: [[D_ADDR:%.+]] = alloca i8*, 24 // CHECK: [[X_ADDR:%.+]] = alloca i8*, 25 // CHECK: [[EVT_ADDR:%.+]] = alloca i64, 26 // CHECK: [[A_ADDR:%.+]] = alloca i32, 27 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num( 28 // CHECK: [[ALLOC:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @{{.+}}, i32 [[GTID]], i32 65, i64 48, i64 0, i32 (i32, i8*)* bitcast (i32 (i32, [[PRIVATES_TY:%.+]]*)* [[TASK_ENTRY:@.+]] to i32 (i32, i8*)*)) 29 // CHECK: [[EVT_VAL:%.+]] = call i8* @__kmpc_task_allow_completion_event(%struct.ident_t* @{{.+}}, i32 [[GTID]], i8* [[ALLOC]]) 30 // CHECK: [[CAST_EVT_VAL:%.+]] = ptrtoint i8* [[EVT_VAL]] to i64 31 // CHECK: store i64 [[CAST_EVT_VAL]], i64* [[EVT_ADDR]], 32 // CHECK: [[DATA:%.+]] = bitcast i8* [[ALLOC]] to [[PRIVATES_TY]]* 33 // CHECK: [[D:%.+]] = load i8*, i8** [[D_ADDR]], 34 // CHECK: [[D_DEP:%.+]] = bitcast i8* [[D]] to %struct.kmp_depend_info* 35 // CHECK: [[D_DEP_BASE:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[D_DEP]], i{{.+}} -1 36 // CHECK: [[D_DEP_BASE_SIZE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[D_DEP_BASE]], i{{.+}} 0, i{{.+}} 0 37 // CHECK: [[SIZE1:%.+]] = load i64, i64* [[D_DEP_BASE_SIZE]], 38 // CHECK: [[SIZE:%.+]] = add nuw i64 0, [[SIZE1]] 39 // CHECK: [[X:%.+]] = load i8*, i8** [[X_ADDR]], 40 // CHECK: [[X_DEP:%.+]] = bitcast i8* [[X]] to %struct.kmp_depend_info* 41 // CHECK: [[X_DEP_BASE:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[X_DEP]], i{{.+}} -1 42 // CHECK: [[X_DEP_BASE_SIZE:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[X_DEP_BASE]], i{{.+}} 0, i{{.+}} 0 43 // CHECK: [[SIZE2:%.+]] = load i64, i64* [[X_DEP_BASE_SIZE]], 44 // CHECK: [[SIZE3:%.+]] = add nuw i64 [[SIZE]], [[SIZE2]] 45 // CHECK: [[SIZE:%.+]] = add nuw i64 [[SIZE3]], 2 46 // CHECK: [[SIZE32:%.+]] = trunc i64 [[SIZE]] to i32 47 // CHECK: [[SIZE64:%.+]] = zext i32 [[SIZE32]] to i64 48 // CHECK: [[SV:%.+]] = call i8* @llvm.stacksave() 49 // CHECK: store i8* [[SV]], i8** [[SV_ADDR:%.+]], 50 // CHECK: [[VLA:%.+]] = alloca %struct.kmp_depend_info, i64 [[SIZE64]], 51 // CHECK: [[VLA0:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA]], i64 0 52 // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA0]], i{{.+}} 0, i{{.+}} 0 53 // CHECK: [[A_ADDR_CAST:%.+]] = ptrtoint i32* [[A_ADDR]] to i64 54 // CHECK: store i64 [[A_ADDR_CAST]], i64* [[BASE_ADDR]], 55 // CHECK: [[SIZE_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA0]], i{{.+}} 0, i{{.+}} 1 56 // CHECK: store i64 4, i64* [[SIZE_ADDR]], 57 // CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA0]], i{{.+}} 0, i{{.+}} 2 58 // CHECK: store i8 1, i8* [[FLAGS_ADDR]], 59 // CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]], 60 // CHECK: [[A_CAST:%.+]] = sext i32 [[A]] to i64 61 // CHECK: [[SZ1:%.+]] = mul nuw i64 24, [[A_CAST]] 62 // CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]], 63 // CHECK: [[A_CAST:%.+]] = sext i32 [[A]] to i64 64 // CHECK: [[SZ:%.+]] = mul nuw i64 [[SZ1]], [[A_CAST]] 65 // CHECK: [[VLA1:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA]], i64 1 66 // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 0 67 // CHECK: [[B_ADDR_CAST:%.+]] = ptrtoint i32** %{{.+}} to i64 68 // CHECK: store i64 [[B_ADDR_CAST]], i64* [[BASE_ADDR]], 69 // CHECK: [[SIZE_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 1 70 // CHECK: store i64 [[SZ]], i64* [[SIZE_ADDR]], 71 // CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 2 72 // CHECK: store i8 1, i8* [[FLAGS_ADDR]], 73 // CHECK: [[VLA_D:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA]], i64 2 74 // CHECK: [[D_SIZE:%.+]] = mul nuw i64 24, [[SIZE1]] 75 // CHECK: [[DEST:%.+]] = bitcast %struct.kmp_depend_info* [[VLA_D]] to i8* 76 // CHECK: [[SRC:%.+]] = bitcast %struct.kmp_depend_info* [[D_DEP]] to i8* 77 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align {{.+}} [[DEST]], i8* align {{.+}} [[SRC]], i64 [[D_SIZE]], i1 false) 78 // CHECK: [[VLA_X:%.+]] = getelementptr %struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA_D]], i64 [[SIZE1]] 79 // CHECK: [[X_SIZE:%.+]] = mul nuw i64 24, [[SIZE2]] 80 // CHECK: [[DEST:%.+]] = bitcast %struct.kmp_depend_info* [[VLA_X]] to i8* 81 // CHECK: [[SRC:%.+]] = bitcast %struct.kmp_depend_info* [[X_DEP]] to i8* 82 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[DEST]], i8* align 8 [[SRC]], i64 [[X_SIZE]], i1 false) 83 // CHECK: [[BC:%.+]] = bitcast %struct.kmp_depend_info* [[VLA]] to i8* 84 // CHECK: call i32 @__kmpc_omp_task_with_deps(%struct.ident_t* @{{.+}}, i32 [[GTID]], i8* [[ALLOC]], i32 [[SIZE32]], i8* [[BC]], i32 0, i8* null) 85 // CHECK: [[SV:%.+]] = load i8*, i8** [[SV_ADDR]], 86 // CHECK: call void @llvm.stackrestore(i8* [[SV]]) 87 #pragma omp task depend(in: a, ([3][a][a])&b) depend(depobj: d, x) detach(evt) 88 { 89 #pragma omp taskgroup 90 { 91 #pragma omp task 92 foo(); 93 } 94 } 95 // CHECK: ret i32 0 96 return 0; 97 } 98 // CHECK: call void @__kmpc_taskgroup( 99 // CHECK: call i8* @__kmpc_omp_task_alloc( 100 // CHECK: call i32 @__kmpc_omp_task( 101 // CHECK: call void @__kmpc_end_taskgroup( 102 103 // CHECK-LINE: @bar 104 void bar() { 105 // CHECK: call void @__kmpc_for_static_init_4( 106 #pragma omp for 107 for (int i = 0; i < 10; ++i) 108 // CHECK: [[BUF:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 1, i64 48, 109 // CHECK: [[BC_BUF:%.+]] = bitcast i8* [[BUF]] to [[TT_WITH_PRIVS:%.+]]* 110 // CHECK: [[PRIVS:%.+]] = getelementptr inbounds [[TT_WITH_PRIVS]], [[TT_WITH_PRIVS]]* [[BC_BUF]], i32 0, i32 1 111 // CHECK: [[I_PRIV:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}} [[PRIVS]], i32 0, i32 0 112 // CHECK: store i32 %{{.+}}, i32* [[I_PRIV]], 113 // CHECK: = call i32 @__kmpc_omp_task(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i8* [[BUF]]) 114 #pragma omp task 115 ++i; 116 } 117 #endif 118