166748541SAlexey Bataev // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
2*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -triple x86_64-apple-darwin10 -fopenmp -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1
3*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s
4*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK2
5*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK3
6*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fopenmp-enable-irbuilder -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s
7*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fopenmp-enable-irbuilder -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK4
866748541SAlexey Bataev 
9*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -triple x86_64-apple-darwin10 -fopenmp-simd -x c++ -emit-llvm %s -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
10*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s
11*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --implicit-check-not="{{__kmpc|__tgt}}"
1266748541SAlexey Bataev // expected-no-diagnostics
1366748541SAlexey Bataev 
1466748541SAlexey Bataev #ifndef HEADER
1566748541SAlexey Bataev #define HEADER
1666748541SAlexey Bataev 
1766748541SAlexey Bataev class a {
1866748541SAlexey Bataev public:
1966748541SAlexey Bataev   void b();
2066748541SAlexey Bataev };
2166748541SAlexey Bataev void c() {
2266748541SAlexey Bataev   a d;
2366748541SAlexey Bataev #pragma omp task
2466748541SAlexey Bataev   d.b();
2566748541SAlexey Bataev }
2666748541SAlexey Bataev #endif
2766748541SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@_Z1cv
2866748541SAlexey Bataev // CHECK1-SAME: () #[[ATTR0:[0-9]+]] {
2966748541SAlexey Bataev // CHECK1-NEXT:  entry:
3066748541SAlexey Bataev // CHECK1-NEXT:    [[D:%.*]] = alloca [[CLASS_A:%.*]], align 1
3166748541SAlexey Bataev // CHECK1-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
3266748541SAlexey Bataev // CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
3366748541SAlexey Bataev // CHECK1-NEXT:    [[TMP1:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 48, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
3466748541SAlexey Bataev // CHECK1-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %struct.kmp_task_t_with_privates*
3566748541SAlexey Bataev // CHECK1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP2]], i32 0, i32 0
3666748541SAlexey Bataev // CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP2]], i32 0, i32 1
3766748541SAlexey Bataev // CHECK1-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP4]], i32 0, i32 0
3866748541SAlexey Bataev // CHECK1-NEXT:    [[TMP6:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP1]])
3966748541SAlexey Bataev // CHECK1-NEXT:    ret void
4066748541SAlexey Bataev //
4166748541SAlexey Bataev //
4266748541SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.omp_task_privates_map.
431b1c8d83Shyeongyu kim // CHECK1-SAME: (%struct..kmp_privates.t* noalias noundef [[TMP0:%.*]], %class.a** noalias noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] {
4466748541SAlexey Bataev // CHECK1-NEXT:  entry:
4566748541SAlexey Bataev // CHECK1-NEXT:    [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8
4666748541SAlexey Bataev // CHECK1-NEXT:    [[DOTADDR1:%.*]] = alloca %class.a**, align 8
4766748541SAlexey Bataev // CHECK1-NEXT:    store %struct..kmp_privates.t* [[TMP0]], %struct..kmp_privates.t** [[DOTADDR]], align 8
4866748541SAlexey Bataev // CHECK1-NEXT:    store %class.a** [[TMP1]], %class.a*** [[DOTADDR1]], align 8
4966748541SAlexey Bataev // CHECK1-NEXT:    [[TMP2:%.*]] = load %struct..kmp_privates.t*, %struct..kmp_privates.t** [[DOTADDR]], align 8
5066748541SAlexey Bataev // CHECK1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP2]], i32 0, i32 0
5166748541SAlexey Bataev // CHECK1-NEXT:    [[TMP4:%.*]] = load %class.a**, %class.a*** [[DOTADDR1]], align 8
5266748541SAlexey Bataev // CHECK1-NEXT:    store %class.a* [[TMP3]], %class.a** [[TMP4]], align 8
5366748541SAlexey Bataev // CHECK1-NEXT:    ret void
5466748541SAlexey Bataev //
5566748541SAlexey Bataev //
5666748541SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry.
571b1c8d83Shyeongyu kim // CHECK1-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {
5866748541SAlexey Bataev // CHECK1-NEXT:  entry:
5966748541SAlexey Bataev // CHECK1-NEXT:    [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
6066748541SAlexey Bataev // CHECK1-NEXT:    [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
6166748541SAlexey Bataev // CHECK1-NEXT:    [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
6266748541SAlexey Bataev // CHECK1-NEXT:    [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
6366748541SAlexey Bataev // CHECK1-NEXT:    [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
6466748541SAlexey Bataev // CHECK1-NEXT:    [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
6566748541SAlexey Bataev // CHECK1-NEXT:    [[DOTFIRSTPRIV_PTR_ADDR_I:%.*]] = alloca %class.a*, align 8
6666748541SAlexey Bataev // CHECK1-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
6766748541SAlexey Bataev // CHECK1-NEXT:    [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
6866748541SAlexey Bataev // CHECK1-NEXT:    store i32 [[TMP0]], i32* [[DOTADDR]], align 4
6966748541SAlexey Bataev // CHECK1-NEXT:    store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
7066748541SAlexey Bataev // CHECK1-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
7166748541SAlexey Bataev // CHECK1-NEXT:    [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
7266748541SAlexey Bataev // CHECK1-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
7366748541SAlexey Bataev // CHECK1-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
7466748541SAlexey Bataev // CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
7566748541SAlexey Bataev // CHECK1-NEXT:    [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
7666748541SAlexey Bataev // CHECK1-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
7766748541SAlexey Bataev // CHECK1-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 1
7866748541SAlexey Bataev // CHECK1-NEXT:    [[TMP10:%.*]] = bitcast %struct..kmp_privates.t* [[TMP9]] to i8*
7966748541SAlexey Bataev // CHECK1-NEXT:    [[TMP11:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
8066748541SAlexey Bataev // CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])
8166748541SAlexey Bataev // CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META6:![0-9]+]])
8266748541SAlexey Bataev // CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
8366748541SAlexey Bataev // CHECK1-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
8466748541SAlexey Bataev // CHECK1-NEXT:    store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !12
8566748541SAlexey Bataev // CHECK1-NEXT:    store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !12
8666748541SAlexey Bataev // CHECK1-NEXT:    store i8* [[TMP10]], i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
8766748541SAlexey Bataev // CHECK1-NEXT:    store void (i8*, ...)* bitcast (void (%struct..kmp_privates.t*, %class.a**)* @.omp_task_privates_map. to void (i8*, ...)*), void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
8866748541SAlexey Bataev // CHECK1-NEXT:    store i8* [[TMP11]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !12
8966748541SAlexey Bataev // CHECK1-NEXT:    store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
9066748541SAlexey Bataev // CHECK1-NEXT:    [[TMP12:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
9166748541SAlexey Bataev // CHECK1-NEXT:    [[TMP13:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
9266748541SAlexey Bataev // CHECK1-NEXT:    [[TMP14:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
9366748541SAlexey Bataev // CHECK1-NEXT:    [[TMP15:%.*]] = bitcast void (i8*, ...)* [[TMP13]] to void (i8*, %class.a**)*
9466748541SAlexey Bataev // CHECK1-NEXT:    call void [[TMP15]](i8* [[TMP14]], %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]]) #[[ATTR4:[0-9]+]]
9566748541SAlexey Bataev // CHECK1-NEXT:    [[TMP16:%.*]] = load %class.a*, %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !12
9667aa314bSFlorian Hahn // CHECK1-NEXT:    call void @_ZN1a1bEv(%class.a* noundef nonnull align 1 dereferenceable(1) [[TMP16]]) #[[ATTR4]]
9766748541SAlexey Bataev // CHECK1-NEXT:    ret i32 0
9866748541SAlexey Bataev //
9966748541SAlexey Bataev //
10066748541SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@_Z1cv
10166748541SAlexey Bataev // CHECK2-SAME: () #[[ATTR0:[0-9]+]] {
10266748541SAlexey Bataev // CHECK2-NEXT:  entry:
10366748541SAlexey Bataev // CHECK2-NEXT:    [[D:%.*]] = alloca [[CLASS_A:%.*]], align 1
10466748541SAlexey Bataev // CHECK2-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
10566748541SAlexey Bataev // CHECK2-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]])
10666748541SAlexey Bataev // CHECK2-NEXT:    [[TMP1:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i32 1, i64 48, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
10766748541SAlexey Bataev // CHECK2-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to %struct.kmp_task_t_with_privates*
10866748541SAlexey Bataev // CHECK2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP2]], i32 0, i32 0
10966748541SAlexey Bataev // CHECK2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP2]], i32 0, i32 1
11066748541SAlexey Bataev // CHECK2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP4]], i32 0, i32 0
11166748541SAlexey Bataev // CHECK2-NEXT:    [[TMP6:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]], i8* [[TMP1]])
11266748541SAlexey Bataev // CHECK2-NEXT:    ret void
11366748541SAlexey Bataev //
11466748541SAlexey Bataev //
11566748541SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_task_privates_map.
1161b1c8d83Shyeongyu kim // CHECK2-SAME: (%struct..kmp_privates.t* noalias noundef [[TMP0:%.*]], %class.a** noalias noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] {
11766748541SAlexey Bataev // CHECK2-NEXT:  entry:
11866748541SAlexey Bataev // CHECK2-NEXT:    [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8
11966748541SAlexey Bataev // CHECK2-NEXT:    [[DOTADDR1:%.*]] = alloca %class.a**, align 8
12066748541SAlexey Bataev // CHECK2-NEXT:    store %struct..kmp_privates.t* [[TMP0]], %struct..kmp_privates.t** [[DOTADDR]], align 8
12166748541SAlexey Bataev // CHECK2-NEXT:    store %class.a** [[TMP1]], %class.a*** [[DOTADDR1]], align 8
12266748541SAlexey Bataev // CHECK2-NEXT:    [[TMP2:%.*]] = load %struct..kmp_privates.t*, %struct..kmp_privates.t** [[DOTADDR]], align 8
12366748541SAlexey Bataev // CHECK2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP2]], i32 0, i32 0
12466748541SAlexey Bataev // CHECK2-NEXT:    [[TMP4:%.*]] = load %class.a**, %class.a*** [[DOTADDR1]], align 8
12566748541SAlexey Bataev // CHECK2-NEXT:    store %class.a* [[TMP3]], %class.a** [[TMP4]], align 8
12666748541SAlexey Bataev // CHECK2-NEXT:    ret void
12766748541SAlexey Bataev //
12866748541SAlexey Bataev //
12966748541SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry.
1301b1c8d83Shyeongyu kim // CHECK2-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {
13166748541SAlexey Bataev // CHECK2-NEXT:  entry:
13266748541SAlexey Bataev // CHECK2-NEXT:    [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
13366748541SAlexey Bataev // CHECK2-NEXT:    [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
13466748541SAlexey Bataev // CHECK2-NEXT:    [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
13566748541SAlexey Bataev // CHECK2-NEXT:    [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
13666748541SAlexey Bataev // CHECK2-NEXT:    [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
13766748541SAlexey Bataev // CHECK2-NEXT:    [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
13866748541SAlexey Bataev // CHECK2-NEXT:    [[DOTFIRSTPRIV_PTR_ADDR_I:%.*]] = alloca %class.a*, align 8
13966748541SAlexey Bataev // CHECK2-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
14066748541SAlexey Bataev // CHECK2-NEXT:    [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
14166748541SAlexey Bataev // CHECK2-NEXT:    store i32 [[TMP0]], i32* [[DOTADDR]], align 4
14266748541SAlexey Bataev // CHECK2-NEXT:    store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
14366748541SAlexey Bataev // CHECK2-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
14466748541SAlexey Bataev // CHECK2-NEXT:    [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
14566748541SAlexey Bataev // CHECK2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
14666748541SAlexey Bataev // CHECK2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
14766748541SAlexey Bataev // CHECK2-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
14866748541SAlexey Bataev // CHECK2-NEXT:    [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
14966748541SAlexey Bataev // CHECK2-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
15066748541SAlexey Bataev // CHECK2-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 1
15166748541SAlexey Bataev // CHECK2-NEXT:    [[TMP10:%.*]] = bitcast %struct..kmp_privates.t* [[TMP9]] to i8*
15266748541SAlexey Bataev // CHECK2-NEXT:    [[TMP11:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
15366748541SAlexey Bataev // CHECK2-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])
15466748541SAlexey Bataev // CHECK2-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META6:![0-9]+]])
15566748541SAlexey Bataev // CHECK2-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
15666748541SAlexey Bataev // CHECK2-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
15766748541SAlexey Bataev // CHECK2-NEXT:    store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !12
15866748541SAlexey Bataev // CHECK2-NEXT:    store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !12
15966748541SAlexey Bataev // CHECK2-NEXT:    store i8* [[TMP10]], i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
16066748541SAlexey Bataev // CHECK2-NEXT:    store void (i8*, ...)* bitcast (void (%struct..kmp_privates.t*, %class.a**)* @.omp_task_privates_map. to void (i8*, ...)*), void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
16166748541SAlexey Bataev // CHECK2-NEXT:    store i8* [[TMP11]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !12
16266748541SAlexey Bataev // CHECK2-NEXT:    store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
16366748541SAlexey Bataev // CHECK2-NEXT:    [[TMP12:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
16466748541SAlexey Bataev // CHECK2-NEXT:    [[TMP13:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
16566748541SAlexey Bataev // CHECK2-NEXT:    [[TMP14:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
16666748541SAlexey Bataev // CHECK2-NEXT:    [[TMP15:%.*]] = bitcast void (i8*, ...)* [[TMP13]] to void (i8*, %class.a**)*
16766748541SAlexey Bataev // CHECK2-NEXT:    call void [[TMP15]](i8* [[TMP14]], %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]]) #[[ATTR4:[0-9]+]]
16866748541SAlexey Bataev // CHECK2-NEXT:    [[TMP16:%.*]] = load %class.a*, %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !12
16967aa314bSFlorian Hahn // CHECK2-NEXT:    call void @_ZN1a1bEv(%class.a* noundef nonnull align 1 dereferenceable(1) [[TMP16]]) #[[ATTR4]]
17066748541SAlexey Bataev // CHECK2-NEXT:    ret i32 0
17166748541SAlexey Bataev //
17266748541SAlexey Bataev //
17366748541SAlexey Bataev // CHECK3-LABEL: define {{[^@]+}}@_Z1cv
17466748541SAlexey Bataev // CHECK3-SAME: () #[[ATTR0:[0-9]+]] {
17566748541SAlexey Bataev // CHECK3-NEXT:  entry:
17666748541SAlexey Bataev // CHECK3-NEXT:    [[D:%.*]] = alloca [[CLASS_A:%.*]], align 1
17766748541SAlexey Bataev // CHECK3-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
17866748541SAlexey Bataev // CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]])
17966748541SAlexey Bataev // CHECK3-NEXT:    [[TMP0:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 1, i64 48, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
18066748541SAlexey Bataev // CHECK3-NEXT:    [[TMP1:%.*]] = bitcast i8* [[TMP0]] to %struct.kmp_task_t_with_privates*
18166748541SAlexey Bataev // CHECK3-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP1]], i32 0, i32 0
18266748541SAlexey Bataev // CHECK3-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP1]], i32 0, i32 1
18366748541SAlexey Bataev // CHECK3-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP3]], i32 0, i32 0
18466748541SAlexey Bataev // CHECK3-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3]])
18566748541SAlexey Bataev // CHECK3-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i8* [[TMP0]])
18666748541SAlexey Bataev // CHECK3-NEXT:    ret void
18766748541SAlexey Bataev //
18866748541SAlexey Bataev //
18966748541SAlexey Bataev // CHECK3-LABEL: define {{[^@]+}}@.omp_task_privates_map.
1901b1c8d83Shyeongyu kim // CHECK3-SAME: (%struct..kmp_privates.t* noalias noundef [[TMP0:%.*]], %class.a** noalias noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] {
19166748541SAlexey Bataev // CHECK3-NEXT:  entry:
19266748541SAlexey Bataev // CHECK3-NEXT:    [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8
19366748541SAlexey Bataev // CHECK3-NEXT:    [[DOTADDR1:%.*]] = alloca %class.a**, align 8
19466748541SAlexey Bataev // CHECK3-NEXT:    store %struct..kmp_privates.t* [[TMP0]], %struct..kmp_privates.t** [[DOTADDR]], align 8
19566748541SAlexey Bataev // CHECK3-NEXT:    store %class.a** [[TMP1]], %class.a*** [[DOTADDR1]], align 8
19666748541SAlexey Bataev // CHECK3-NEXT:    [[TMP2:%.*]] = load %struct..kmp_privates.t*, %struct..kmp_privates.t** [[DOTADDR]], align 8
19766748541SAlexey Bataev // CHECK3-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP2]], i32 0, i32 0
19866748541SAlexey Bataev // CHECK3-NEXT:    [[TMP4:%.*]] = load %class.a**, %class.a*** [[DOTADDR1]], align 8
19966748541SAlexey Bataev // CHECK3-NEXT:    store %class.a* [[TMP3]], %class.a** [[TMP4]], align 8
20066748541SAlexey Bataev // CHECK3-NEXT:    ret void
20166748541SAlexey Bataev //
20266748541SAlexey Bataev //
20366748541SAlexey Bataev // CHECK3-LABEL: define {{[^@]+}}@.omp_task_entry.
2041b1c8d83Shyeongyu kim // CHECK3-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {
20566748541SAlexey Bataev // CHECK3-NEXT:  entry:
20666748541SAlexey Bataev // CHECK3-NEXT:    [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
20766748541SAlexey Bataev // CHECK3-NEXT:    [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
20866748541SAlexey Bataev // CHECK3-NEXT:    [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
20966748541SAlexey Bataev // CHECK3-NEXT:    [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
21066748541SAlexey Bataev // CHECK3-NEXT:    [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
21166748541SAlexey Bataev // CHECK3-NEXT:    [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
21266748541SAlexey Bataev // CHECK3-NEXT:    [[DOTFIRSTPRIV_PTR_ADDR_I:%.*]] = alloca %class.a*, align 8
21366748541SAlexey Bataev // CHECK3-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
21466748541SAlexey Bataev // CHECK3-NEXT:    [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
21566748541SAlexey Bataev // CHECK3-NEXT:    store i32 [[TMP0]], i32* [[DOTADDR]], align 4
21666748541SAlexey Bataev // CHECK3-NEXT:    store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
21766748541SAlexey Bataev // CHECK3-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
21866748541SAlexey Bataev // CHECK3-NEXT:    [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
21966748541SAlexey Bataev // CHECK3-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
22066748541SAlexey Bataev // CHECK3-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
22166748541SAlexey Bataev // CHECK3-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
22266748541SAlexey Bataev // CHECK3-NEXT:    [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
22366748541SAlexey Bataev // CHECK3-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
22466748541SAlexey Bataev // CHECK3-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 1
22566748541SAlexey Bataev // CHECK3-NEXT:    [[TMP10:%.*]] = bitcast %struct..kmp_privates.t* [[TMP9]] to i8*
22666748541SAlexey Bataev // CHECK3-NEXT:    [[TMP11:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
22766748541SAlexey Bataev // CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])
22866748541SAlexey Bataev // CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META6:![0-9]+]])
22966748541SAlexey Bataev // CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
23066748541SAlexey Bataev // CHECK3-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
23166748541SAlexey Bataev // CHECK3-NEXT:    store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !12
23266748541SAlexey Bataev // CHECK3-NEXT:    store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !12
23366748541SAlexey Bataev // CHECK3-NEXT:    store i8* [[TMP10]], i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
23466748541SAlexey Bataev // CHECK3-NEXT:    store void (i8*, ...)* bitcast (void (%struct..kmp_privates.t*, %class.a**)* @.omp_task_privates_map. to void (i8*, ...)*), void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
23566748541SAlexey Bataev // CHECK3-NEXT:    store i8* [[TMP11]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !12
23666748541SAlexey Bataev // CHECK3-NEXT:    store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
23766748541SAlexey Bataev // CHECK3-NEXT:    [[TMP12:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
23866748541SAlexey Bataev // CHECK3-NEXT:    [[TMP13:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
23966748541SAlexey Bataev // CHECK3-NEXT:    [[TMP14:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
24066748541SAlexey Bataev // CHECK3-NEXT:    [[TMP15:%.*]] = bitcast void (i8*, ...)* [[TMP13]] to void (i8*, %class.a**)*
24166748541SAlexey Bataev // CHECK3-NEXT:    call void [[TMP15]](i8* [[TMP14]], %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]]) #[[ATTR4:[0-9]+]]
24266748541SAlexey Bataev // CHECK3-NEXT:    [[TMP16:%.*]] = load %class.a*, %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !12
24367aa314bSFlorian Hahn // CHECK3-NEXT:    call void @_ZN1a1bEv(%class.a* noundef nonnull align 1 dereferenceable(1) [[TMP16]]) #[[ATTR4]]
24466748541SAlexey Bataev // CHECK3-NEXT:    ret i32 0
24566748541SAlexey Bataev //
24666748541SAlexey Bataev //
24766748541SAlexey Bataev // CHECK4-LABEL: define {{[^@]+}}@_Z1cv
24866748541SAlexey Bataev // CHECK4-SAME: () #[[ATTR0:[0-9]+]] {
24966748541SAlexey Bataev // CHECK4-NEXT:  entry:
25066748541SAlexey Bataev // CHECK4-NEXT:    [[D:%.*]] = alloca [[CLASS_A:%.*]], align 1
25166748541SAlexey Bataev // CHECK4-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 1
25266748541SAlexey Bataev // CHECK4-NEXT:    [[OMP_GLOBAL_THREAD_NUM:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3:[0-9]+]])
25366748541SAlexey Bataev // CHECK4-NEXT:    [[TMP0:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM]], i32 1, i64 48, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*))
25466748541SAlexey Bataev // CHECK4-NEXT:    [[TMP1:%.*]] = bitcast i8* [[TMP0]] to %struct.kmp_task_t_with_privates*
25566748541SAlexey Bataev // CHECK4-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP1]], i32 0, i32 0
25666748541SAlexey Bataev // CHECK4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP1]], i32 0, i32 1
25766748541SAlexey Bataev // CHECK4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP3]], i32 0, i32 0
25866748541SAlexey Bataev // CHECK4-NEXT:    [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB3]])
25966748541SAlexey Bataev // CHECK4-NEXT:    [[TMP5:%.*]] = call i32 @__kmpc_omp_task(%struct.ident_t* @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i8* [[TMP0]])
26066748541SAlexey Bataev // CHECK4-NEXT:    ret void
26166748541SAlexey Bataev //
26266748541SAlexey Bataev //
26366748541SAlexey Bataev // CHECK4-LABEL: define {{[^@]+}}@.omp_task_privates_map.
2641b1c8d83Shyeongyu kim // CHECK4-SAME: (%struct..kmp_privates.t* noalias noundef [[TMP0:%.*]], %class.a** noalias noundef [[TMP1:%.*]]) #[[ATTR2:[0-9]+]] {
26566748541SAlexey Bataev // CHECK4-NEXT:  entry:
26666748541SAlexey Bataev // CHECK4-NEXT:    [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8
26766748541SAlexey Bataev // CHECK4-NEXT:    [[DOTADDR1:%.*]] = alloca %class.a**, align 8
26866748541SAlexey Bataev // CHECK4-NEXT:    store %struct..kmp_privates.t* [[TMP0]], %struct..kmp_privates.t** [[DOTADDR]], align 8
26966748541SAlexey Bataev // CHECK4-NEXT:    store %class.a** [[TMP1]], %class.a*** [[DOTADDR1]], align 8
27066748541SAlexey Bataev // CHECK4-NEXT:    [[TMP2:%.*]] = load %struct..kmp_privates.t*, %struct..kmp_privates.t** [[DOTADDR]], align 8
27166748541SAlexey Bataev // CHECK4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP2]], i32 0, i32 0
27266748541SAlexey Bataev // CHECK4-NEXT:    [[TMP4:%.*]] = load %class.a**, %class.a*** [[DOTADDR1]], align 8
27366748541SAlexey Bataev // CHECK4-NEXT:    store %class.a* [[TMP3]], %class.a** [[TMP4]], align 8
27466748541SAlexey Bataev // CHECK4-NEXT:    ret void
27566748541SAlexey Bataev //
27666748541SAlexey Bataev //
27766748541SAlexey Bataev // CHECK4-LABEL: define {{[^@]+}}@.omp_task_entry.
2781b1c8d83Shyeongyu kim // CHECK4-SAME: (i32 noundef [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] {
27966748541SAlexey Bataev // CHECK4-NEXT:  entry:
28066748541SAlexey Bataev // CHECK4-NEXT:    [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4
28166748541SAlexey Bataev // CHECK4-NEXT:    [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8
28266748541SAlexey Bataev // CHECK4-NEXT:    [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8
28366748541SAlexey Bataev // CHECK4-NEXT:    [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8
28466748541SAlexey Bataev // CHECK4-NEXT:    [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8
28566748541SAlexey Bataev // CHECK4-NEXT:    [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8
28666748541SAlexey Bataev // CHECK4-NEXT:    [[DOTFIRSTPRIV_PTR_ADDR_I:%.*]] = alloca %class.a*, align 8
28766748541SAlexey Bataev // CHECK4-NEXT:    [[DOTADDR:%.*]] = alloca i32, align 4
28866748541SAlexey Bataev // CHECK4-NEXT:    [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8
28966748541SAlexey Bataev // CHECK4-NEXT:    store i32 [[TMP0]], i32* [[DOTADDR]], align 4
29066748541SAlexey Bataev // CHECK4-NEXT:    store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
29166748541SAlexey Bataev // CHECK4-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4
29266748541SAlexey Bataev // CHECK4-NEXT:    [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8
29366748541SAlexey Bataev // CHECK4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0
29466748541SAlexey Bataev // CHECK4-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2
29566748541SAlexey Bataev // CHECK4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0
29666748541SAlexey Bataev // CHECK4-NEXT:    [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8
29766748541SAlexey Bataev // CHECK4-NEXT:    [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon*
29866748541SAlexey Bataev // CHECK4-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 1
29966748541SAlexey Bataev // CHECK4-NEXT:    [[TMP10:%.*]] = bitcast %struct..kmp_privates.t* [[TMP9]] to i8*
30066748541SAlexey Bataev // CHECK4-NEXT:    [[TMP11:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8*
30166748541SAlexey Bataev // CHECK4-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])
30266748541SAlexey Bataev // CHECK4-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META6:![0-9]+]])
30366748541SAlexey Bataev // CHECK4-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META8:![0-9]+]])
30466748541SAlexey Bataev // CHECK4-NEXT:    call void @llvm.experimental.noalias.scope.decl(metadata [[META10:![0-9]+]])
30566748541SAlexey Bataev // CHECK4-NEXT:    store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !12
30666748541SAlexey Bataev // CHECK4-NEXT:    store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !12
30766748541SAlexey Bataev // CHECK4-NEXT:    store i8* [[TMP10]], i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
30866748541SAlexey Bataev // CHECK4-NEXT:    store void (i8*, ...)* bitcast (void (%struct..kmp_privates.t*, %class.a**)* @.omp_task_privates_map. to void (i8*, ...)*), void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
30966748541SAlexey Bataev // CHECK4-NEXT:    store i8* [[TMP11]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !12
31066748541SAlexey Bataev // CHECK4-NEXT:    store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
31166748541SAlexey Bataev // CHECK4-NEXT:    [[TMP12:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !12
31266748541SAlexey Bataev // CHECK4-NEXT:    [[TMP13:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !12
31366748541SAlexey Bataev // CHECK4-NEXT:    [[TMP14:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !12
31466748541SAlexey Bataev // CHECK4-NEXT:    [[TMP15:%.*]] = bitcast void (i8*, ...)* [[TMP13]] to void (i8*, %class.a**)*
31566748541SAlexey Bataev // CHECK4-NEXT:    call void [[TMP15]](i8* [[TMP14]], %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]]) #[[ATTR4:[0-9]+]]
31666748541SAlexey Bataev // CHECK4-NEXT:    [[TMP16:%.*]] = load %class.a*, %class.a** [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !12
31767aa314bSFlorian Hahn // CHECK4-NEXT:    call void @_ZN1a1bEv(%class.a* noundef nonnull align 1 dereferenceable(1) [[TMP16]]) #[[ATTR4]]
31866748541SAlexey Bataev // CHECK4-NEXT:    ret i32 0
31966748541SAlexey Bataev //
320