1*207b08a9SGiorgis Georgakoudis // 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*207b08a9SGiorgis Georgakoudis // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK1 360e51c48SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s 4*207b08a9SGiorgis Georgakoudis // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK2 560e51c48SAlexey Bataev 6*207b08a9SGiorgis Georgakoudis // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK3 760e51c48SAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s 8*207b08a9SGiorgis Georgakoudis // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix=CHECK4 960e51c48SAlexey Bataev // expected-no-diagnostics 1060e51c48SAlexey Bataev #ifndef HEADER 1160e51c48SAlexey Bataev #define HEADER 1260e51c48SAlexey Bataev 1360e51c48SAlexey Bataev 1460e51c48SAlexey Bataev struct S { 1560e51c48SAlexey Bataev int a; 1660e51c48SAlexey Bataev S() : a(0) {} 1760e51c48SAlexey Bataev S(const S&) {} 1860e51c48SAlexey Bataev S& operator=(const S&) {return *this;} 1960e51c48SAlexey Bataev ~S() {} 2060e51c48SAlexey Bataev friend S operator+(const S&a, const S&b) {return a;} 2160e51c48SAlexey Bataev }; 2260e51c48SAlexey Bataev 2360e51c48SAlexey Bataev 2460e51c48SAlexey Bataev int main(int argc, char **argv) { 2560e51c48SAlexey Bataev int a; 2660e51c48SAlexey Bataev float b; 2760e51c48SAlexey Bataev S c[5]; 2860e51c48SAlexey Bataev short d[argc]; 2960e51c48SAlexey Bataev #pragma omp taskgroup task_reduction(+: a, b, argc) 3060e51c48SAlexey Bataev { 3160e51c48SAlexey Bataev #pragma omp taskgroup task_reduction(-:c, d) 3260e51c48SAlexey Bataev #pragma omp parallel 3360e51c48SAlexey Bataev #pragma omp master taskloop in_reduction(+:a) in_reduction(-:d) 3460e51c48SAlexey Bataev for (int i = 0; i < 5; ++i) 3560e51c48SAlexey Bataev a += d[a]; 3660e51c48SAlexey Bataev } 3760e51c48SAlexey Bataev return 0; 3860e51c48SAlexey Bataev } 3960e51c48SAlexey Bataev 4060e51c48SAlexey Bataev 4160e51c48SAlexey Bataev 4260e51c48SAlexey Bataev #endif 43*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@main 44*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] { 45*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 46*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 47*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4 48*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8 49*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[A:%.*]] = alloca i32, align 4 50*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[B:%.*]] = alloca float, align 4 51*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[C:%.*]] = alloca [5 x %struct.S], align 16 52*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca i8*, align 8 53*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8 54*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTRD_INPUT_:%.*]] = alloca [3 x %struct.kmp_taskred_input_t], align 8 55*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTTASK_RED_:%.*]] = alloca i8*, align 8 56*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTRD_INPUT_3:%.*]] = alloca [2 x %struct.kmp_taskred_input_t.0], align 8 57*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTTASK_RED_6:%.*]] = alloca i8*, align 8 58*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]) 59*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[RETVAL]], align 4 60*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4 61*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8 62*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 63*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 64*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 65*207b08a9SGiorgis Georgakoudis // CHECK1: arrayctor.loop: 66*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %struct.S* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ] 67*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SC1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]]) 68*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYCTOR_CUR]], i64 1 69*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %struct.S* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 70*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 71*207b08a9SGiorgis Georgakoudis // CHECK1: arrayctor.cont: 72*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 73*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64 74*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = call i8* @llvm.stacksave() 75*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP3]], i8** [[SAVED_STACK]], align 8 76*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[VLA:%.*]] = alloca i16, i64 [[TMP2]], align 16 77*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[TMP2]], i64* [[__VLA_EXPR0]], align 8 78*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 79*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTRD_INPUT_GEP_:%.*]] = getelementptr inbounds [3 x %struct.kmp_taskred_input_t], [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]], i64 0, i64 0 80*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T:%.*]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 0 81*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i32* [[A]] to i8* 82*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP5]], i8** [[TMP4]], align 8 83*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 1 84*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = bitcast i32* [[A]] to i8* 85*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP7]], i8** [[TMP6]], align 8 86*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 2 87*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 4, i64* [[TMP8]], align 8 88*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 3 89*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init. to i8*), i8** [[TMP9]], align 8 90*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 4 91*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* null, i8** [[TMP10]], align 8 92*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 5 93*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb. to i8*), i8** [[TMP11]], align 8 94*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 6 95*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP13:%.*]] = bitcast i32* [[TMP12]] to i8* 96*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP13]], i8 0, i64 4, i1 false) 97*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTRD_INPUT_GEP_1:%.*]] = getelementptr inbounds [3 x %struct.kmp_taskred_input_t], [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]], i64 0, i64 1 98*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 0 99*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP15:%.*]] = bitcast float* [[B]] to i8* 100*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP15]], i8** [[TMP14]], align 8 101*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 1 102*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = bitcast float* [[B]] to i8* 103*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP17]], i8** [[TMP16]], align 8 104*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 2 105*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 4, i64* [[TMP18]], align 8 106*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 3 107*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..1 to i8*), i8** [[TMP19]], align 8 108*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 4 109*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* null, i8** [[TMP20]], align 8 110*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 5 111*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..2 to i8*), i8** [[TMP21]], align 8 112*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 6 113*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = bitcast i32* [[TMP22]] to i8* 114*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP23]], i8 0, i64 4, i1 false) 115*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTRD_INPUT_GEP_2:%.*]] = getelementptr inbounds [3 x %struct.kmp_taskred_input_t], [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]], i64 0, i64 2 116*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 0 117*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = bitcast i32* [[ARGC_ADDR]] to i8* 118*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP25]], i8** [[TMP24]], align 8 119*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 1 120*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP27:%.*]] = bitcast i32* [[ARGC_ADDR]] to i8* 121*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP27]], i8** [[TMP26]], align 8 122*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP28:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 2 123*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 4, i64* [[TMP28]], align 8 124*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP29:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 3 125*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..3 to i8*), i8** [[TMP29]], align 8 126*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 4 127*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* null, i8** [[TMP30]], align 8 128*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP31:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 5 129*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..4 to i8*), i8** [[TMP31]], align 8 130*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP32:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 6 131*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP33:%.*]] = bitcast i32* [[TMP32]] to i8* 132*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP33]], i8 0, i64 4, i1 false) 133*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP34:%.*]] = bitcast [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]] to i8* 134*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP35:%.*]] = call i8* @__kmpc_taskred_init(i32 [[TMP0]], i32 3, i8* [[TMP34]]) 135*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP35]], i8** [[DOTTASK_RED_]], align 8 136*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 137*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTRD_INPUT_GEP_4:%.*]] = getelementptr inbounds [2 x %struct.kmp_taskred_input_t.0], [2 x %struct.kmp_taskred_input_t.0]* [[DOTRD_INPUT_3]], i64 0, i64 0 138*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP36:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0:%.*]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 0 139*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP37:%.*]] = bitcast [5 x %struct.S]* [[C]] to i8* 140*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP37]], i8** [[TMP36]], align 8 141*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP38:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 1 142*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP39:%.*]] = bitcast [5 x %struct.S]* [[C]] to i8* 143*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP39]], i8** [[TMP38]], align 8 144*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP40:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 2 145*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 20, i64* [[TMP40]], align 8 146*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 3 147*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..5 to i8*), i8** [[TMP41]], align 8 148*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP42:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 4 149*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*)* @.red_fini. to i8*), i8** [[TMP42]], align 8 150*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP43:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 5 151*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..6 to i8*), i8** [[TMP43]], align 8 152*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP44:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 6 153*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP45:%.*]] = bitcast i32* [[TMP44]] to i8* 154*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP45]], i8 0, i64 4, i1 false) 155*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTRD_INPUT_GEP_5:%.*]] = getelementptr inbounds [2 x %struct.kmp_taskred_input_t.0], [2 x %struct.kmp_taskred_input_t.0]* [[DOTRD_INPUT_3]], i64 0, i64 1 156*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP46:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 0 157*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP47:%.*]] = bitcast i16* [[VLA]] to i8* 158*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP47]], i8** [[TMP46]], align 8 159*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP48:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 1 160*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP49:%.*]] = bitcast i16* [[VLA]] to i8* 161*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP49]], i8** [[TMP48]], align 8 162*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP50:%.*]] = mul nuw i64 [[TMP2]], 2 163*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP51:%.*]] = udiv exact i64 [[TMP50]], ptrtoint (i16* getelementptr (i16, i16* null, i32 1) to i64) 164*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP52:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 2 165*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[TMP50]], i64* [[TMP52]], align 8 166*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP53:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 3 167*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..7 to i8*), i8** [[TMP53]], align 8 168*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP54:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 4 169*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* null, i8** [[TMP54]], align 8 170*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP55:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 5 171*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..8 to i8*), i8** [[TMP55]], align 8 172*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP56:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 6 173*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 1, i32* [[TMP56]], align 8 174*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP57:%.*]] = bitcast [2 x %struct.kmp_taskred_input_t.0]* [[DOTRD_INPUT_3]] to i8* 175*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP58:%.*]] = call i8* @__kmpc_taskred_init(i32 [[TMP0]], i32 2, i8* [[TMP57]]) 176*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP58]], i8** [[DOTTASK_RED_6]], align 8 177*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i16*, i8**, i8**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[A]], i64 [[TMP2]], i16* [[VLA]], i8** [[DOTTASK_RED_]], i8** [[DOTTASK_RED_6]]) 178*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 179*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 180*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[RETVAL]], align 4 181*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP59:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8 182*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.stackrestore(i8* [[TMP59]]) 183*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 184*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP60:%.*]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAY_BEGIN7]], i64 5 185*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 186*207b08a9SGiorgis Georgakoudis // CHECK1: arraydestroy.body: 187*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP60]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 188*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 189*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3:[0-9]+]] 190*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %struct.S* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]] 191*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]] 192*207b08a9SGiorgis Georgakoudis // CHECK1: arraydestroy.done8: 193*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP61:%.*]] = load i32, i32* [[RETVAL]], align 4 194*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret i32 [[TMP61]] 195*207b08a9SGiorgis Georgakoudis // 196*207b08a9SGiorgis Georgakoudis // 197*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZN1SC1Ev 198*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 { 199*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 200*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 201*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 202*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 203*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SC2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) 204*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 205*207b08a9SGiorgis Georgakoudis // 206*207b08a9SGiorgis Georgakoudis // 207*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_init. 208*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] { 209*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 210*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 211*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 212*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 213*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 214*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 215*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 216*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[TMP3]], align 8 217*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 218*207b08a9SGiorgis Georgakoudis // 219*207b08a9SGiorgis Georgakoudis // 220*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_comb. 221*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 222*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 223*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 224*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 225*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 226*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 227*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 228*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 229*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 230*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to i32* 231*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP3]], align 8 232*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP5]], align 8 233*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP6]], [[TMP7]] 234*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD]], i32* [[TMP3]], align 8 235*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 236*207b08a9SGiorgis Georgakoudis // 237*207b08a9SGiorgis Georgakoudis // 238*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_init..1 239*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 240*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 241*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 242*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 243*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 244*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 245*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 246*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to float* 247*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store float 0.000000e+00, float* [[TMP3]], align 8 248*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 249*207b08a9SGiorgis Georgakoudis // 250*207b08a9SGiorgis Georgakoudis // 251*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_comb..2 252*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 253*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 254*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 255*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 256*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 257*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 258*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 259*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to float* 260*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 261*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to float* 262*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load float, float* [[TMP3]], align 8 263*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load float, float* [[TMP5]], align 8 264*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = fadd float [[TMP6]], [[TMP7]] 265*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store float [[ADD]], float* [[TMP3]], align 8 266*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 267*207b08a9SGiorgis Georgakoudis // 268*207b08a9SGiorgis Georgakoudis // 269*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_init..3 270*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 271*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 272*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 273*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 274*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 275*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 276*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 277*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 278*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[TMP3]], align 8 279*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 280*207b08a9SGiorgis Georgakoudis // 281*207b08a9SGiorgis Georgakoudis // 282*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_comb..4 283*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 284*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 285*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 286*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 287*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 288*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 289*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 290*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 291*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 292*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to i32* 293*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP3]], align 8 294*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP5]], align 8 295*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP6]], [[TMP7]] 296*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD]], i32* [[TMP3]], align 8 297*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 298*207b08a9SGiorgis Georgakoudis // 299*207b08a9SGiorgis Georgakoudis // 300*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_init..5 301*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 302*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 303*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 304*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 305*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 306*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 307*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 308*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [5 x %struct.S]* 309*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[TMP3]], i32 0, i32 0 310*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 311*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq %struct.S* [[ARRAY_BEGIN]], [[TMP4]] 312*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 313*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arrayinit.body: 314*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi %struct.S* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 315*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SC1Ev(%struct.S* nonnull dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]]) 316*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], %struct.S* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 317*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq %struct.S* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP4]] 318*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 319*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arrayinit.done: 320*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 321*207b08a9SGiorgis Georgakoudis // 322*207b08a9SGiorgis Georgakoudis // 323*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_fini. 324*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5]] { 325*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 326*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 327*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 328*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8 329*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to [5 x %struct.S]* 330*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[TMP2]], i32 0, i32 0 331*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 332*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 333*207b08a9SGiorgis Georgakoudis // CHECK1: arraydestroy.body: 334*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP3]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 335*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 336*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 337*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %struct.S* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]] 338*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]] 339*207b08a9SGiorgis Georgakoudis // CHECK1: arraydestroy.done1: 340*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 341*207b08a9SGiorgis Georgakoudis // 342*207b08a9SGiorgis Georgakoudis // 343*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZN1SD1Ev 344*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 345*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 346*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 347*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 348*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 349*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SD2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) #[[ATTR3]] 350*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 351*207b08a9SGiorgis Georgakoudis // 352*207b08a9SGiorgis Georgakoudis // 353*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_comb..6 354*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 355*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 356*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 357*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 358*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S:%.*]], align 4 359*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 360*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 361*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 362*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to %struct.S* 363*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 364*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to %struct.S* 365*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr [[STRUCT_S]], %struct.S* [[TMP3]], i64 5 366*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq %struct.S* [[TMP3]], [[TMP6]] 367*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 368*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arraycpy.body: 369*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 370*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP3]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 371*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZplRK1SS1_(%struct.S* sret([[STRUCT_S]]) align 4 [[REF_TMP]], %struct.S* nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], %struct.S* nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]]) 372*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(4) %struct.S* @_ZN1SaSERKS_(%struct.S* nonnull dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], %struct.S* nonnull align 4 dereferenceable(4) [[REF_TMP]]) 373*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[REF_TMP]]) #[[ATTR3]] 374*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], %struct.S* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 375*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], %struct.S* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 376*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq %struct.S* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP6]] 377*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]] 378*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arraycpy.done2: 379*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 380*207b08a9SGiorgis Georgakoudis // 381*207b08a9SGiorgis Georgakoudis // 382*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZplRK1SS1_ 383*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* noalias sret([[STRUCT_S:%.*]]) align 4 [[AGG_RESULT:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[A:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR7:[0-9]+]] { 384*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 385*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[RESULT_PTR:%.*]] = alloca i8*, align 8 386*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[A_ADDR:%.*]] = alloca %struct.S*, align 8 387*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[B_ADDR:%.*]] = alloca %struct.S*, align 8 388*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = bitcast %struct.S* [[AGG_RESULT]] to i8* 389*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[RESULT_PTR]], align 8 390*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[A]], %struct.S** [[A_ADDR]], align 8 391*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[B]], %struct.S** [[B_ADDR]], align 8 392*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load %struct.S*, %struct.S** [[A_ADDR]], align 8 393*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SC1ERKS_(%struct.S* nonnull dereferenceable(4) [[AGG_RESULT]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP1]]) 394*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 395*207b08a9SGiorgis Georgakoudis // 396*207b08a9SGiorgis Georgakoudis // 397*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZN1SaSERKS_ 398*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR7]] align 2 { 399*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 400*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 401*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca %struct.S*, align 8 402*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 403*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[TMP0]], %struct.S** [[DOTADDR]], align 8 404*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 405*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret %struct.S* [[THIS1]] 406*207b08a9SGiorgis Georgakoudis // 407*207b08a9SGiorgis Georgakoudis // 408*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_init..7 409*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 410*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 411*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 412*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 413*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]]) 414*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 415*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 416*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8 417*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i64* @{{reduction_size[.].+[.]}}) 418*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to i64* 419*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load i64, i64* [[TMP5]], align 8 420*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP3]] to i16* 421*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = getelementptr i16, i16* [[TMP7]], i64 [[TMP6]] 422*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq i16* [[TMP7]], [[TMP8]] 423*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 424*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arrayinit.body: 425*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i16* [ [[TMP7]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 426*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i16 0, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 2 427*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i16, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 428*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i16* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]] 429*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 430*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arrayinit.done: 431*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 432*207b08a9SGiorgis Georgakoudis // 433*207b08a9SGiorgis Georgakoudis // 434*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.red_comb..8 435*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 436*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 437*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 438*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 439*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]]) 440*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 441*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 442*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i64* @{{reduction_size[.].+[.]}}) 443*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = bitcast i8* [[TMP3]] to i64* 444*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = load i64, i64* [[TMP4]], align 8 445*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load i8*, i8** [[DOTADDR]], align 8 446*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP6]] to i16* 447*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 448*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = bitcast i8* [[TMP8]] to i16* 449*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr i16, i16* [[TMP7]], i64 [[TMP5]] 450*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i16* [[TMP7]], [[TMP10]] 451*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE4:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 452*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arraycpy.body: 453*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i16* [ [[TMP9]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 454*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i16* [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 455*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = load i16, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 2 456*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV:%.*]] = sext i16 [[TMP11]] to i32 457*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = load i16, i16* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 2 458*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV2:%.*]] = sext i16 [[TMP12]] to i32 459*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV]], [[CONV2]] 460*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV3:%.*]] = trunc i32 [[ADD]] to i16 461*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i16 [[CONV3]], i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 2 462*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i16, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 463*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i16, i16* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 464*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i16* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP10]] 465*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] 466*207b08a9SGiorgis Georgakoudis // CHECK1: omp.arraycpy.done4: 467*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 468*207b08a9SGiorgis Georgakoudis // 469*207b08a9SGiorgis Georgakoudis // 470*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined. 471*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i64 [[VLA:%.*]], i16* nonnull align 2 dereferenceable(2) [[D:%.*]], i8** nonnull align 8 dereferenceable(8) [[DOTTASK_RED_:%.*]], i8** nonnull align 8 dereferenceable(8) [[DOTTASK_RED_1:%.*]]) #[[ATTR8:[0-9]+]] { 472*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 473*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 474*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 475*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i32*, align 8 476*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8 477*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[D_ADDR:%.*]] = alloca i16*, align 8 478*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTTASK_RED__ADDR:%.*]] = alloca i8**, align 8 479*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTTASK_RED__ADDR2:%.*]] = alloca i8**, align 8 480*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8 481*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP:%.*]] = alloca i32, align 4 482*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 483*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 484*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[A]], i32** [[A_ADDR]], align 8 485*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[VLA]], i64* [[VLA_ADDR]], align 8 486*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i16* [[D]], i16** [[D_ADDR]], align 8 487*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8** [[DOTTASK_RED_]], i8*** [[DOTTASK_RED__ADDR]], align 8 488*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8** [[DOTTASK_RED_1]], i8*** [[DOTTASK_RED__ADDR2]], align 8 489*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP0:%.*]] = load i32*, i32** [[A_ADDR]], align 8 490*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8 491*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i16*, i16** [[D_ADDR]], align 8 492*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = load i8**, i8*** [[DOTTASK_RED__ADDR]], align 8 493*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = load i8**, i8*** [[DOTTASK_RED__ADDR2]], align 8 494*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 495*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 496*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 497*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0 498*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[TMP8]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] 499*207b08a9SGiorgis Georgakoudis // CHECK1: omp_if.then: 500*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 0 501*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[TMP0]], i32** [[TMP9]], align 8 502*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 1 503*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[TMP1]], i64* [[TMP10]], align 8 504*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 2 505*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i16* [[TMP2]], i16** [[TMP11]], align 8 506*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 3 507*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8** [[TMP3]], i8*** [[TMP12]], align 8 508*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 4 509*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8** [[TMP4]], i8*** [[TMP13]], align 8 510*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 511*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i64 96, i64 40, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*)) 512*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP15:%.*]] = bitcast i8* [[TMP14]] to %struct.kmp_task_t_with_privates* 513*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP15]], i32 0, i32 0 514*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 0 515*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP18:%.*]] = load i8*, i8** [[TMP17]], align 8 516*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = bitcast %struct.anon* [[AGG_CAPTURED]] to i8* 517*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP18]], i8* align 8 [[TMP19]], i64 40, i1 false) 518*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP15]], i32 0, i32 1 519*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP20]], i32 0, i32 0 520*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = load i8*, i8** [[TMP3]], align 8 521*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP22]], i8** [[TMP21]], align 8 522*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T]], %struct..kmp_privates.t* [[TMP20]], i32 0, i32 1 523*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = load i8*, i8** [[TMP4]], align 8 524*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP24]], i8** [[TMP23]], align 8 525*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 5 526*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 0, i64* [[TMP25]], align 8 527*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 6 528*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 4, i64* [[TMP26]], align 8 529*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 7 530*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 1, i64* [[TMP27]], align 8 531*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP28:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 9 532*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to i8* 533*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP29]], i8 0, i64 8, i1 false) 534*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP30:%.*]] = load i64, i64* [[TMP27]], align 8 535*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_taskloop(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i8* [[TMP14]], i32 1, i64* [[TMP25]], i64* [[TMP26]], i64 [[TMP30]], i32 1, i32 0, i64 0, i8* null) 536*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 537*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 538*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_IF_END]] 539*207b08a9SGiorgis Georgakoudis // CHECK1: omp_if.end: 540*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 541*207b08a9SGiorgis Georgakoudis // 542*207b08a9SGiorgis Georgakoudis // 543*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.omp_task_privates_map. 544*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct..kmp_privates.t* noalias [[TMP0:%.*]], i8*** noalias [[TMP1:%.*]], i8*** noalias [[TMP2:%.*]]) #[[ATTR9:[0-9]+]] { 545*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 546*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8 547*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8***, align 8 548*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca i8***, align 8 549*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct..kmp_privates.t* [[TMP0]], %struct..kmp_privates.t** [[DOTADDR]], align 8 550*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8*** [[TMP1]], i8**** [[DOTADDR1]], align 8 551*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8*** [[TMP2]], i8**** [[DOTADDR2]], align 8 552*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = load %struct..kmp_privates.t*, %struct..kmp_privates.t** [[DOTADDR]], align 8 553*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP3]], i32 0, i32 0 554*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = load i8***, i8**** [[DOTADDR1]], align 8 555*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8** [[TMP4]], i8*** [[TMP5]], align 8 556*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T]], %struct..kmp_privates.t* [[TMP3]], i32 0, i32 1 557*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i8***, i8**** [[DOTADDR2]], align 8 558*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8** [[TMP6]], i8*** [[TMP7]], align 8 559*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 560*207b08a9SGiorgis Georgakoudis // 561*207b08a9SGiorgis Georgakoudis // 562*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@.omp_task_entry. 563*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR5]] { 564*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 565*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4 566*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8 567*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8 568*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8 569*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8 570*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTLB__ADDR_I:%.*]] = alloca i64, align 8 571*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTUB__ADDR_I:%.*]] = alloca i64, align 8 572*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTST__ADDR_I:%.*]] = alloca i64, align 8 573*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTLITER__ADDR_I:%.*]] = alloca i32, align 4 574*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTREDUCTIONS__ADDR_I:%.*]] = alloca i8*, align 8 575*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8 576*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTFIRSTPRIV_PTR_ADDR_I:%.*]] = alloca i8**, align 8 577*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTFIRSTPRIV_PTR_ADDR1_I:%.*]] = alloca i8**, align 8 578*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[I_I:%.*]] = alloca i32, align 4 579*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTOMP_IV_I:%.*]] = alloca i32, align 4 580*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4 581*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8 582*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4 583*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 584*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4 585*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 586*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0 587*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2 588*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0 589*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 590*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon* 591*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 1 592*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP10:%.*]] = bitcast %struct..kmp_privates.t* [[TMP9]] to i8* 593*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP11:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8* 594*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 5 595*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP13:%.*]] = load i64, i64* [[TMP12]], align 8 596*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 6 597*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP15:%.*]] = load i64, i64* [[TMP14]], align 8 598*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 7 599*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP17:%.*]] = load i64, i64* [[TMP16]], align 8 600*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 8 601*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP19:%.*]] = load i32, i32* [[TMP18]], align 8 602*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 9 603*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP21:%.*]] = load i8*, i8** [[TMP20]], align 8 604*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META2:![0-9]+]]) 605*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]]) 606*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META7:![0-9]+]]) 607*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META9:![0-9]+]]) 608*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META11:![0-9]+]]) 609*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !13 610*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !13 611*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP10]], i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !13 612*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store void (i8*, ...)* bitcast (void (%struct..kmp_privates.t*, i8***, i8***)* @.omp_task_privates_map. to void (i8*, ...)*), void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !13 613*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP11]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !13 614*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[TMP13]], i64* [[DOTLB__ADDR_I]], align 8, !noalias !13 615*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[TMP15]], i64* [[DOTUB__ADDR_I]], align 8, !noalias !13 616*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[TMP17]], i64* [[DOTST__ADDR_I]], align 8, !noalias !13 617*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP19]], i32* [[DOTLITER__ADDR_I]], align 4, !noalias !13 618*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i8* [[TMP21]], i8** [[DOTREDUCTIONS__ADDR_I]], align 8, !noalias !13 619*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !13 620*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP22:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !13 621*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP22]], i32 0, i32 1 622*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP24:%.*]] = load i64, i64* [[TMP23]], align 8 623*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP25:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !13 624*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP26:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !13 625*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP27:%.*]] = bitcast void (i8*, ...)* [[TMP25]] to void (i8*, i8***, i8***)* 626*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void [[TMP27]](i8* [[TMP26]], i8*** [[DOTFIRSTPRIV_PTR_ADDR_I]], i8*** [[DOTFIRSTPRIV_PTR_ADDR1_I]]) #[[ATTR3]] 627*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP28:%.*]] = load i8**, i8*** [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !13 628*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP29:%.*]] = load i8**, i8*** [[DOTFIRSTPRIV_PTR_ADDR1_I]], align 8, !noalias !13 629*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[TMP22]], i32 0, i32 0 630*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP31:%.*]] = load i32*, i32** [[TMP30]], align 8 631*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP32:%.*]] = load i8*, i8** [[TMP28]], align 8 632*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !13 633*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP34:%.*]] = bitcast i32* [[TMP31]] to i8* 634*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP35:%.*]] = call i8* @__kmpc_task_reduction_get_th_data(i32 [[TMP33]], i8* [[TMP32]], i8* [[TMP34]]) #[[ATTR3]] 635*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV_I:%.*]] = bitcast i8* [[TMP35]] to i32* 636*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP36:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[TMP22]], i32 0, i32 2 637*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP37:%.*]] = load i16*, i16** [[TMP36]], align 8 638*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP38:%.*]] = mul nuw i64 [[TMP24]], 2 639*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP39:%.*]] = udiv exact i64 [[TMP38]], ptrtoint (i16* getelementptr (i16, i16* null, i32 1) to i64) 640*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP40:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]], i8* bitcast (i64* @{{reduction_size[.].+[.]}}) #[[ATTR3]] 641*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP41:%.*]] = bitcast i8* [[TMP40]] to i64* 642*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i64 [[TMP39]], i64* [[TMP41]], align 8 643*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP42:%.*]] = load i8*, i8** [[TMP29]], align 8 644*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP43:%.*]] = bitcast i16* [[TMP37]] to i8* 645*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP44:%.*]] = call i8* @__kmpc_task_reduction_get_th_data(i32 [[TMP33]], i8* [[TMP42]], i8* [[TMP43]]) #[[ATTR3]] 646*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV2_I:%.*]] = bitcast i8* [[TMP44]] to i16* 647*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP45:%.*]] = load i64, i64* [[DOTLB__ADDR_I]], align 8, !noalias !13 648*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV3_I:%.*]] = trunc i64 [[TMP45]] to i32 649*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[CONV3_I]], i32* [[DOTOMP_IV_I]], align 4, !noalias !13 650*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND_I:%.*]] 651*207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.cond.i: 652*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP46:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !13 653*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV4_I:%.*]] = sext i32 [[TMP46]] to i64 654*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP47:%.*]] = load i64, i64* [[DOTUB__ADDR_I]], align 8, !noalias !13 655*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CMP_I:%.*]] = icmp ule i64 [[CONV4_I]], [[TMP47]] 656*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br i1 [[CMP_I]], label [[OMP_INNER_FOR_BODY_I:%.*]], label [[DOTOMP_OUTLINED__9_EXIT:%.*]] 657*207b08a9SGiorgis Georgakoudis // CHECK1: omp.inner.for.body.i: 658*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP48:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !13 659*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[TMP48]], i32* [[I_I]], align 4, !noalias !13 660*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP49:%.*]] = load i32, i32* [[CONV_I]], align 4 661*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[IDXPROM_I:%.*]] = sext i32 [[TMP49]] to i64 662*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ARRAYIDX_I:%.*]] = getelementptr inbounds i16, i16* [[CONV2_I]], i64 [[IDXPROM_I]] 663*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP50:%.*]] = load i16, i16* [[ARRAYIDX_I]], align 2 664*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[CONV5_I:%.*]] = sext i16 [[TMP50]] to i32 665*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP51:%.*]] = load i32, i32* [[CONV_I]], align 4 666*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD6_I:%.*]] = add nsw i32 [[TMP51]], [[CONV5_I]] 667*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD6_I]], i32* [[CONV_I]], align 4 668*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP52:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !13 669*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[ADD7_I:%.*]] = add nsw i32 [[TMP52]], 1 670*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 [[ADD7_I]], i32* [[DOTOMP_IV_I]], align 4, !noalias !13 671*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND_I]] 672*207b08a9SGiorgis Georgakoudis // CHECK1: .omp_outlined..9.exit: 673*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret i32 0 674*207b08a9SGiorgis Georgakoudis // 675*207b08a9SGiorgis Georgakoudis // 676*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZN1SC2Ev 677*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 678*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 679*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 680*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 681*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 682*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0 683*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store i32 0, i32* [[A]], align 4 684*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 685*207b08a9SGiorgis Georgakoudis // 686*207b08a9SGiorgis Georgakoudis // 687*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZN1SD2Ev 688*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 689*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 690*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 691*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 692*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 693*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 694*207b08a9SGiorgis Georgakoudis // 695*207b08a9SGiorgis Georgakoudis // 696*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZN1SC1ERKS_ 697*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 698*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 699*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 700*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca %struct.S*, align 8 701*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 702*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[TMP0]], %struct.S** [[DOTADDR]], align 8 703*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 704*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[TMP1:%.*]] = load %struct.S*, %struct.S** [[DOTADDR]], align 8 705*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: call void @_ZN1SC2ERKS_(%struct.S* nonnull dereferenceable(4) [[THIS1]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP1]]) 706*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 707*207b08a9SGiorgis Georgakoudis // 708*207b08a9SGiorgis Georgakoudis // 709*207b08a9SGiorgis Georgakoudis // CHECK1-LABEL: define {{[^@]+}}@_ZN1SC2ERKS_ 710*207b08a9SGiorgis Georgakoudis // CHECK1-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 711*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: entry: 712*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 713*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca %struct.S*, align 8 714*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 715*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: store %struct.S* [[TMP0]], %struct.S** [[DOTADDR]], align 8 716*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 717*207b08a9SGiorgis Georgakoudis // CHECK1-NEXT: ret void 718*207b08a9SGiorgis Georgakoudis // 719*207b08a9SGiorgis Georgakoudis // 720*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@main 721*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] { 722*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 723*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 724*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4 725*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8 726*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[A:%.*]] = alloca i32, align 4 727*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[B:%.*]] = alloca float, align 4 728*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[C:%.*]] = alloca [5 x %struct.S], align 16 729*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[SAVED_STACK:%.*]] = alloca i8*, align 8 730*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8 731*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTRD_INPUT_:%.*]] = alloca [3 x %struct.kmp_taskred_input_t], align 8 732*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTTASK_RED_:%.*]] = alloca i8*, align 8 733*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTRD_INPUT_3:%.*]] = alloca [2 x %struct.kmp_taskred_input_t.0], align 8 734*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTTASK_RED_6:%.*]] = alloca i8*, align 8 735*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1:[0-9]+]]) 736*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 0, i32* [[RETVAL]], align 4 737*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4 738*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8 739*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 740*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 741*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 742*207b08a9SGiorgis Georgakoudis // CHECK2: arrayctor.loop: 743*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %struct.S* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ] 744*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SC1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]]) 745*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYCTOR_CUR]], i64 1 746*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %struct.S* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 747*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 748*207b08a9SGiorgis Georgakoudis // CHECK2: arrayctor.cont: 749*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 750*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64 751*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = call i8* @llvm.stacksave() 752*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP3]], i8** [[SAVED_STACK]], align 8 753*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[VLA:%.*]] = alloca i16, i64 [[TMP2]], align 16 754*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[TMP2]], i64* [[__VLA_EXPR0]], align 8 755*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 756*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTRD_INPUT_GEP_:%.*]] = getelementptr inbounds [3 x %struct.kmp_taskred_input_t], [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]], i64 0, i64 0 757*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T:%.*]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 0 758*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i32* [[A]] to i8* 759*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP5]], i8** [[TMP4]], align 8 760*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 1 761*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = bitcast i32* [[A]] to i8* 762*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP7]], i8** [[TMP6]], align 8 763*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 2 764*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 4, i64* [[TMP8]], align 8 765*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 3 766*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init. to i8*), i8** [[TMP9]], align 8 767*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 4 768*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* null, i8** [[TMP10]], align 8 769*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 5 770*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb. to i8*), i8** [[TMP11]], align 8 771*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 6 772*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP13:%.*]] = bitcast i32* [[TMP12]] to i8* 773*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP13]], i8 0, i64 4, i1 false) 774*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTRD_INPUT_GEP_1:%.*]] = getelementptr inbounds [3 x %struct.kmp_taskred_input_t], [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]], i64 0, i64 1 775*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 0 776*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP15:%.*]] = bitcast float* [[B]] to i8* 777*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP15]], i8** [[TMP14]], align 8 778*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 1 779*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP17:%.*]] = bitcast float* [[B]] to i8* 780*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP17]], i8** [[TMP16]], align 8 781*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 2 782*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 4, i64* [[TMP18]], align 8 783*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP19:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 3 784*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..1 to i8*), i8** [[TMP19]], align 8 785*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 4 786*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* null, i8** [[TMP20]], align 8 787*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 5 788*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..2 to i8*), i8** [[TMP21]], align 8 789*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP22:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_1]], i32 0, i32 6 790*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP23:%.*]] = bitcast i32* [[TMP22]] to i8* 791*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP23]], i8 0, i64 4, i1 false) 792*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTRD_INPUT_GEP_2:%.*]] = getelementptr inbounds [3 x %struct.kmp_taskred_input_t], [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]], i64 0, i64 2 793*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 0 794*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP25:%.*]] = bitcast i32* [[ARGC_ADDR]] to i8* 795*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP25]], i8** [[TMP24]], align 8 796*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 1 797*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP27:%.*]] = bitcast i32* [[ARGC_ADDR]] to i8* 798*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP27]], i8** [[TMP26]], align 8 799*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP28:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 2 800*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 4, i64* [[TMP28]], align 8 801*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP29:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 3 802*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..3 to i8*), i8** [[TMP29]], align 8 803*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 4 804*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* null, i8** [[TMP30]], align 8 805*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP31:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 5 806*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..4 to i8*), i8** [[TMP31]], align 8 807*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP32:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_2]], i32 0, i32 6 808*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP33:%.*]] = bitcast i32* [[TMP32]] to i8* 809*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP33]], i8 0, i64 4, i1 false) 810*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP34:%.*]] = bitcast [3 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]] to i8* 811*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP35:%.*]] = call i8* @__kmpc_taskred_init(i32 [[TMP0]], i32 3, i8* [[TMP34]]) 812*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP35]], i8** [[DOTTASK_RED_]], align 8 813*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 814*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTRD_INPUT_GEP_4:%.*]] = getelementptr inbounds [2 x %struct.kmp_taskred_input_t.0], [2 x %struct.kmp_taskred_input_t.0]* [[DOTRD_INPUT_3]], i64 0, i64 0 815*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP36:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0:%.*]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 0 816*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP37:%.*]] = bitcast [5 x %struct.S]* [[C]] to i8* 817*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP37]], i8** [[TMP36]], align 8 818*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP38:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 1 819*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP39:%.*]] = bitcast [5 x %struct.S]* [[C]] to i8* 820*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP39]], i8** [[TMP38]], align 8 821*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP40:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 2 822*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 20, i64* [[TMP40]], align 8 823*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 3 824*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..5 to i8*), i8** [[TMP41]], align 8 825*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP42:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 4 826*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*)* @.red_fini. to i8*), i8** [[TMP42]], align 8 827*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP43:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 5 828*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..6 to i8*), i8** [[TMP43]], align 8 829*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP44:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_4]], i32 0, i32 6 830*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP45:%.*]] = bitcast i32* [[TMP44]] to i8* 831*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP45]], i8 0, i64 4, i1 false) 832*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTRD_INPUT_GEP_5:%.*]] = getelementptr inbounds [2 x %struct.kmp_taskred_input_t.0], [2 x %struct.kmp_taskred_input_t.0]* [[DOTRD_INPUT_3]], i64 0, i64 1 833*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP46:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 0 834*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP47:%.*]] = bitcast i16* [[VLA]] to i8* 835*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP47]], i8** [[TMP46]], align 8 836*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP48:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 1 837*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP49:%.*]] = bitcast i16* [[VLA]] to i8* 838*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP49]], i8** [[TMP48]], align 8 839*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP50:%.*]] = mul nuw i64 [[TMP2]], 2 840*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP51:%.*]] = udiv exact i64 [[TMP50]], ptrtoint (i16* getelementptr (i16, i16* null, i32 1) to i64) 841*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP52:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 2 842*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[TMP50]], i64* [[TMP52]], align 8 843*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP53:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 3 844*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init..7 to i8*), i8** [[TMP53]], align 8 845*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP54:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 4 846*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* null, i8** [[TMP54]], align 8 847*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP55:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 5 848*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb..8 to i8*), i8** [[TMP55]], align 8 849*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP56:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T_0]], %struct.kmp_taskred_input_t.0* [[DOTRD_INPUT_GEP_5]], i32 0, i32 6 850*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 1, i32* [[TMP56]], align 8 851*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP57:%.*]] = bitcast [2 x %struct.kmp_taskred_input_t.0]* [[DOTRD_INPUT_3]] to i8* 852*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP58:%.*]] = call i8* @__kmpc_taskred_init(i32 [[TMP0]], i32 2, i8* [[TMP57]]) 853*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP58]], i8** [[DOTTASK_RED_6]], align 8 854*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB1]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i16*, i8**, i8**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* [[A]], i64 [[TMP2]], i16* [[VLA]], i8** [[DOTTASK_RED_]], i8** [[DOTTASK_RED_6]]) 855*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 856*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP0]]) 857*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 0, i32* [[RETVAL]], align 4 858*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP59:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8 859*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.stackrestore(i8* [[TMP59]]) 860*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAY_BEGIN7:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 861*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP60:%.*]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAY_BEGIN7]], i64 5 862*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 863*207b08a9SGiorgis Georgakoudis // CHECK2: arraydestroy.body: 864*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP60]], [[ARRAYCTOR_CONT]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 865*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 866*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3:[0-9]+]] 867*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %struct.S* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN7]] 868*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE8:%.*]], label [[ARRAYDESTROY_BODY]] 869*207b08a9SGiorgis Georgakoudis // CHECK2: arraydestroy.done8: 870*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP61:%.*]] = load i32, i32* [[RETVAL]], align 4 871*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret i32 [[TMP61]] 872*207b08a9SGiorgis Georgakoudis // 873*207b08a9SGiorgis Georgakoudis // 874*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZN1SC1Ev 875*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 { 876*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 877*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 878*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 879*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 880*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SC2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) 881*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 882*207b08a9SGiorgis Georgakoudis // 883*207b08a9SGiorgis Georgakoudis // 884*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_init. 885*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5:[0-9]+]] { 886*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 887*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 888*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 889*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 890*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 891*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 892*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 893*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 0, i32* [[TMP3]], align 8 894*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 895*207b08a9SGiorgis Georgakoudis // 896*207b08a9SGiorgis Georgakoudis // 897*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_comb. 898*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 899*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 900*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 901*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 902*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 903*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 904*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 905*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 906*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 907*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to i32* 908*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP3]], align 8 909*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP5]], align 8 910*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP6]], [[TMP7]] 911*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[ADD]], i32* [[TMP3]], align 8 912*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 913*207b08a9SGiorgis Georgakoudis // 914*207b08a9SGiorgis Georgakoudis // 915*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_init..1 916*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 917*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 918*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 919*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 920*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 921*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 922*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 923*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to float* 924*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store float 0.000000e+00, float* [[TMP3]], align 8 925*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 926*207b08a9SGiorgis Georgakoudis // 927*207b08a9SGiorgis Georgakoudis // 928*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_comb..2 929*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 930*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 931*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 932*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 933*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 934*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 935*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 936*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to float* 937*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 938*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to float* 939*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = load float, float* [[TMP3]], align 8 940*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = load float, float* [[TMP5]], align 8 941*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ADD:%.*]] = fadd float [[TMP6]], [[TMP7]] 942*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store float [[ADD]], float* [[TMP3]], align 8 943*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 944*207b08a9SGiorgis Georgakoudis // 945*207b08a9SGiorgis Georgakoudis // 946*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_init..3 947*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 948*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 949*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 950*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 951*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 952*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 953*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 954*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 955*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 0, i32* [[TMP3]], align 8 956*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 957*207b08a9SGiorgis Georgakoudis // 958*207b08a9SGiorgis Georgakoudis // 959*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_comb..4 960*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 961*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 962*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 963*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 964*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 965*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 966*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 967*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32* 968*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 969*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to i32* 970*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP3]], align 8 971*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[TMP5]], align 8 972*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP6]], [[TMP7]] 973*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[ADD]], i32* [[TMP3]], align 8 974*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 975*207b08a9SGiorgis Georgakoudis // 976*207b08a9SGiorgis Georgakoudis // 977*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_init..5 978*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 979*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 980*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 981*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 982*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 983*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 984*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 985*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [5 x %struct.S]* 986*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[TMP3]], i32 0, i32 0 987*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 988*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq %struct.S* [[ARRAY_BEGIN]], [[TMP4]] 989*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 990*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arrayinit.body: 991*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi %struct.S* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 992*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SC1Ev(%struct.S* nonnull dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]]) 993*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], %struct.S* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 994*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq %struct.S* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP4]] 995*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 996*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arrayinit.done: 997*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 998*207b08a9SGiorgis Georgakoudis // 999*207b08a9SGiorgis Georgakoudis // 1000*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_fini. 1001*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* [[TMP0:%.*]]) #[[ATTR5]] { 1002*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1003*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 1004*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 1005*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP1:%.*]] = load i8*, i8** [[DOTADDR]], align 8 1006*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = bitcast i8* [[TMP1]] to [5 x %struct.S]* 1007*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[TMP2]], i32 0, i32 0 1008*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 1009*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 1010*207b08a9SGiorgis Georgakoudis // CHECK2: arraydestroy.body: 1011*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP3]], [[ENTRY:%.*]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 1012*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 1013*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3]] 1014*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %struct.S* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN]] 1015*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE1:%.*]], label [[ARRAYDESTROY_BODY]] 1016*207b08a9SGiorgis Georgakoudis // CHECK2: arraydestroy.done1: 1017*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1018*207b08a9SGiorgis Georgakoudis // 1019*207b08a9SGiorgis Georgakoudis // 1020*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZN1SD1Ev 1021*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1022*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1023*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1024*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1025*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1026*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SD2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) #[[ATTR3]] 1027*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1028*207b08a9SGiorgis Georgakoudis // 1029*207b08a9SGiorgis Georgakoudis // 1030*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_comb..6 1031*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 1032*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1033*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 1034*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 1035*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT_S:%.*]], align 4 1036*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 1037*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 1038*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 1039*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to %struct.S* 1040*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 1041*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to %struct.S* 1042*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr [[STRUCT_S]], %struct.S* [[TMP3]], i64 5 1043*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq %struct.S* [[TMP3]], [[TMP6]] 1044*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 1045*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arraycpy.body: 1046*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP5]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1047*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP3]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1048*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZplRK1SS1_(%struct.S* sret([[STRUCT_S]]) align 4 [[REF_TMP]], %struct.S* nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], %struct.S* nonnull align 4 dereferenceable(4) [[OMP_ARRAYCPY_SRCELEMENTPAST]]) 1049*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CALL:%.*]] = call nonnull align 4 dereferenceable(4) %struct.S* @_ZN1SaSERKS_(%struct.S* nonnull dereferenceable(4) [[OMP_ARRAYCPY_DESTELEMENTPAST]], %struct.S* nonnull align 4 dereferenceable(4) [[REF_TMP]]) 1050*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[REF_TMP]]) #[[ATTR3]] 1051*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr [[STRUCT_S]], %struct.S* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1052*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr [[STRUCT_S]], %struct.S* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 1053*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq %struct.S* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP6]] 1054*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]] 1055*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arraycpy.done2: 1056*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1057*207b08a9SGiorgis Georgakoudis // 1058*207b08a9SGiorgis Georgakoudis // 1059*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZplRK1SS1_ 1060*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* noalias sret([[STRUCT_S:%.*]]) align 4 [[AGG_RESULT:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[A:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR7:[0-9]+]] { 1061*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1062*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[RESULT_PTR:%.*]] = alloca i8*, align 8 1063*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca %struct.S*, align 8 1064*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[B_ADDR:%.*]] = alloca %struct.S*, align 8 1065*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP0:%.*]] = bitcast %struct.S* [[AGG_RESULT]] to i8* 1066*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[RESULT_PTR]], align 8 1067*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[A]], %struct.S** [[A_ADDR]], align 8 1068*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[B]], %struct.S** [[B_ADDR]], align 8 1069*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP1:%.*]] = load %struct.S*, %struct.S** [[A_ADDR]], align 8 1070*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SC1ERKS_(%struct.S* nonnull dereferenceable(4) [[AGG_RESULT]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP1]]) 1071*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1072*207b08a9SGiorgis Georgakoudis // 1073*207b08a9SGiorgis Georgakoudis // 1074*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZN1SaSERKS_ 1075*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR7]] align 2 { 1076*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1077*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1078*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca %struct.S*, align 8 1079*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1080*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[TMP0]], %struct.S** [[DOTADDR]], align 8 1081*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1082*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret %struct.S* [[THIS1]] 1083*207b08a9SGiorgis Georgakoudis // 1084*207b08a9SGiorgis Georgakoudis // 1085*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_init..7 1086*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* noalias [[TMP0:%.*]], i8* noalias [[TMP1:%.*]]) #[[ATTR5]] { 1087*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1088*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 1089*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 1090*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]]) 1091*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 1092*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 1093*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = load i8*, i8** [[DOTADDR]], align 8 1094*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i64* @{{reduction_size[.].+[.]}}) 1095*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to i64* 1096*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = load i64, i64* [[TMP5]], align 8 1097*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP3]] to i16* 1098*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP8:%.*]] = getelementptr i16, i16* [[TMP7]], i64 [[TMP6]] 1099*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq i16* [[TMP7]], [[TMP8]] 1100*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 1101*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arrayinit.body: 1102*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i16* [ [[TMP7]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 1103*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i16 0, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 2 1104*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i16, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1105*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i16* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]] 1106*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 1107*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arrayinit.done: 1108*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1109*207b08a9SGiorgis Georgakoudis // 1110*207b08a9SGiorgis Georgakoudis // 1111*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.red_comb..8 1112*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i8* [[TMP0:%.*]], i8* [[TMP1:%.*]]) #[[ATTR5]] { 1113*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1114*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 1115*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 1116*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB1]]) 1117*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 1118*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 1119*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP2]], i8* bitcast (i64* @{{reduction_size[.].+[.]}}) 1120*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = bitcast i8* [[TMP3]] to i64* 1121*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = load i64, i64* [[TMP4]], align 8 1122*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = load i8*, i8** [[DOTADDR]], align 8 1123*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP6]] to i16* 1124*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP8:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 1125*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP9:%.*]] = bitcast i8* [[TMP8]] to i16* 1126*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP10:%.*]] = getelementptr i16, i16* [[TMP7]], i64 [[TMP5]] 1127*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i16* [[TMP7]], [[TMP10]] 1128*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE4:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 1129*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arraycpy.body: 1130*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i16* [ [[TMP9]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1131*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i16* [ [[TMP7]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1132*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP11:%.*]] = load i16, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 2 1133*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV:%.*]] = sext i16 [[TMP11]] to i32 1134*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP12:%.*]] = load i16, i16* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 2 1135*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV2:%.*]] = sext i16 [[TMP12]] to i32 1136*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[CONV]], [[CONV2]] 1137*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV3:%.*]] = trunc i32 [[ADD]] to i16 1138*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i16 [[CONV3]], i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 2 1139*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i16, i16* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1140*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i16, i16* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 1141*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i16* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP10]] 1142*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE4]], label [[OMP_ARRAYCPY_BODY]] 1143*207b08a9SGiorgis Georgakoudis // CHECK2: omp.arraycpy.done4: 1144*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1145*207b08a9SGiorgis Georgakoudis // 1146*207b08a9SGiorgis Georgakoudis // 1147*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined. 1148*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i32* noalias [[DOTGLOBAL_TID_:%.*]], i32* noalias [[DOTBOUND_TID_:%.*]], i32* nonnull align 4 dereferenceable(4) [[A:%.*]], i64 [[VLA:%.*]], i16* nonnull align 2 dereferenceable(2) [[D:%.*]], i8** nonnull align 8 dereferenceable(8) [[DOTTASK_RED_:%.*]], i8** nonnull align 8 dereferenceable(8) [[DOTTASK_RED_1:%.*]]) #[[ATTR8:[0-9]+]] { 1149*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1150*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 1151*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 1152*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i32*, align 8 1153*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[VLA_ADDR:%.*]] = alloca i64, align 8 1154*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[D_ADDR:%.*]] = alloca i16*, align 8 1155*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTTASK_RED__ADDR:%.*]] = alloca i8**, align 8 1156*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTTASK_RED__ADDR2:%.*]] = alloca i8**, align 8 1157*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8 1158*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 1159*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 1160*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 1161*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32* [[A]], i32** [[A_ADDR]], align 8 1162*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[VLA]], i64* [[VLA_ADDR]], align 8 1163*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i16* [[D]], i16** [[D_ADDR]], align 8 1164*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8** [[DOTTASK_RED_]], i8*** [[DOTTASK_RED__ADDR]], align 8 1165*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8** [[DOTTASK_RED_1]], i8*** [[DOTTASK_RED__ADDR2]], align 8 1166*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[A_ADDR]], align 8 1167*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP1:%.*]] = load i64, i64* [[VLA_ADDR]], align 8 1168*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i16*, i16** [[D_ADDR]], align 8 1169*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = load i8**, i8*** [[DOTTASK_RED__ADDR]], align 8 1170*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = load i8**, i8*** [[DOTTASK_RED__ADDR2]], align 8 1171*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 1172*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = load i32, i32* [[TMP5]], align 4 1173*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 1174*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP8:%.*]] = icmp ne i32 [[TMP7]], 0 1175*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[TMP8]], label [[OMP_IF_THEN:%.*]], label [[OMP_IF_END:%.*]] 1176*207b08a9SGiorgis Georgakoudis // CHECK2: omp_if.then: 1177*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 0 1178*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32* [[TMP0]], i32** [[TMP9]], align 8 1179*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 1 1180*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[TMP1]], i64* [[TMP10]], align 8 1181*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 2 1182*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i16* [[TMP2]], i16** [[TMP11]], align 8 1183*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 3 1184*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8** [[TMP3]], i8*** [[TMP12]], align 8 1185*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[AGG_CAPTURED]], i32 0, i32 4 1186*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8** [[TMP4]], i8*** [[TMP13]], align 8 1187*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 1188*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP14:%.*]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i32 1, i64 96, i64 40, i32 (i32, i8*)* bitcast (i32 (i32, %struct.kmp_task_t_with_privates*)* @.omp_task_entry. to i32 (i32, i8*)*)) 1189*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP15:%.*]] = bitcast i8* [[TMP14]] to %struct.kmp_task_t_with_privates* 1190*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP15]], i32 0, i32 0 1191*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP17:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 0 1192*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP18:%.*]] = load i8*, i8** [[TMP17]], align 8 1193*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP19:%.*]] = bitcast %struct.anon* [[AGG_CAPTURED]] to i8* 1194*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP18]], i8* align 8 [[TMP19]], i64 40, i1 false) 1195*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP15]], i32 0, i32 1 1196*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP20]], i32 0, i32 0 1197*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP22:%.*]] = load i8*, i8** [[TMP3]], align 8 1198*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP22]], i8** [[TMP21]], align 8 1199*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T]], %struct..kmp_privates.t* [[TMP20]], i32 0, i32 1 1200*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP24:%.*]] = load i8*, i8** [[TMP4]], align 8 1201*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP24]], i8** [[TMP23]], align 8 1202*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 5 1203*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 0, i64* [[TMP25]], align 8 1204*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 6 1205*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 4, i64* [[TMP26]], align 8 1206*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 7 1207*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 1, i64* [[TMP27]], align 8 1208*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP28:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP16]], i32 0, i32 9 1209*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP29:%.*]] = bitcast i8** [[TMP28]] to i8* 1210*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[TMP29]], i8 0, i64 8, i1 false) 1211*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP30:%.*]] = load i64, i64* [[TMP27]], align 8 1212*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_taskloop(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]], i8* [[TMP14]], i32 1, i64* [[TMP25]], i64* [[TMP26]], i64 [[TMP30]], i32 1, i32 0, i64 0, i8* null) 1213*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_end_taskgroup(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 1214*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @__kmpc_end_master(%struct.ident_t* @[[GLOB1]], i32 [[TMP6]]) 1215*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br label [[OMP_IF_END]] 1216*207b08a9SGiorgis Georgakoudis // CHECK2: omp_if.end: 1217*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1218*207b08a9SGiorgis Georgakoudis // 1219*207b08a9SGiorgis Georgakoudis // 1220*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.omp_task_privates_map. 1221*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct..kmp_privates.t* noalias [[TMP0:%.*]], i8*** noalias [[TMP1:%.*]], i8*** noalias [[TMP2:%.*]]) #[[ATTR9:[0-9]+]] { 1222*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1223*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca %struct..kmp_privates.t*, align 8 1224*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8***, align 8 1225*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca i8***, align 8 1226*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct..kmp_privates.t* [[TMP0]], %struct..kmp_privates.t** [[DOTADDR]], align 8 1227*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8*** [[TMP1]], i8**** [[DOTADDR1]], align 8 1228*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8*** [[TMP2]], i8**** [[DOTADDR2]], align 8 1229*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = load %struct..kmp_privates.t*, %struct..kmp_privates.t** [[DOTADDR]], align 8 1230*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T:%.*]], %struct..kmp_privates.t* [[TMP3]], i32 0, i32 0 1231*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = load i8***, i8**** [[DOTADDR1]], align 8 1232*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8** [[TMP4]], i8*** [[TMP5]], align 8 1233*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__KMP_PRIVATES_T]], %struct..kmp_privates.t* [[TMP3]], i32 0, i32 1 1234*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = load i8***, i8**** [[DOTADDR2]], align 8 1235*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8** [[TMP6]], i8*** [[TMP7]], align 8 1236*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1237*207b08a9SGiorgis Georgakoudis // 1238*207b08a9SGiorgis Georgakoudis // 1239*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@.omp_task_entry. 1240*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (i32 [[TMP0:%.*]], %struct.kmp_task_t_with_privates* noalias [[TMP1:%.*]]) #[[ATTR5]] { 1241*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1242*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR_I:%.*]] = alloca i32, align 4 1243*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTPART_ID__ADDR_I:%.*]] = alloca i32*, align 8 1244*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTPRIVATES__ADDR_I:%.*]] = alloca i8*, align 8 1245*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTCOPY_FN__ADDR_I:%.*]] = alloca void (i8*, ...)*, align 8 1246*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTTASK_T__ADDR_I:%.*]] = alloca i8*, align 8 1247*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTLB__ADDR_I:%.*]] = alloca i64, align 8 1248*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTUB__ADDR_I:%.*]] = alloca i64, align 8 1249*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTST__ADDR_I:%.*]] = alloca i64, align 8 1250*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTLITER__ADDR_I:%.*]] = alloca i32, align 4 1251*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTREDUCTIONS__ADDR_I:%.*]] = alloca i8*, align 8 1252*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[__CONTEXT_ADDR_I:%.*]] = alloca %struct.anon*, align 8 1253*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTFIRSTPRIV_PTR_ADDR_I:%.*]] = alloca i8**, align 8 1254*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTFIRSTPRIV_PTR_ADDR1_I:%.*]] = alloca i8**, align 8 1255*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[I_I:%.*]] = alloca i32, align 4 1256*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTOMP_IV_I:%.*]] = alloca i32, align 4 1257*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i32, align 4 1258*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca %struct.kmp_task_t_with_privates*, align 8 1259*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTADDR]], align 4 1260*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.kmp_task_t_with_privates* [[TMP1]], %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 1261*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTADDR]], align 4 1262*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP3:%.*]] = load %struct.kmp_task_t_with_privates*, %struct.kmp_task_t_with_privates** [[DOTADDR1]], align 8 1263*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES:%.*]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 0 1264*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T:%.*]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 2 1265*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 0 1266*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 1267*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %struct.anon* 1268*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T_WITH_PRIVATES]], %struct.kmp_task_t_with_privates* [[TMP3]], i32 0, i32 1 1269*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP10:%.*]] = bitcast %struct..kmp_privates.t* [[TMP9]] to i8* 1270*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP11:%.*]] = bitcast %struct.kmp_task_t_with_privates* [[TMP3]] to i8* 1271*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 5 1272*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP13:%.*]] = load i64, i64* [[TMP12]], align 8 1273*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 6 1274*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP15:%.*]] = load i64, i64* [[TMP14]], align 8 1275*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 7 1276*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP17:%.*]] = load i64, i64* [[TMP16]], align 8 1277*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 8 1278*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[TMP18]], align 8 1279*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASK_T]], %struct.kmp_task_t* [[TMP4]], i32 0, i32 9 1280*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP21:%.*]] = load i8*, i8** [[TMP20]], align 8 1281*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META2:![0-9]+]]) 1282*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META5:![0-9]+]]) 1283*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META7:![0-9]+]]) 1284*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META9:![0-9]+]]) 1285*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META11:![0-9]+]]) 1286*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[TMP2]], i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !13 1287*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32* [[TMP5]], i32** [[DOTPART_ID__ADDR_I]], align 8, !noalias !13 1288*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP10]], i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !13 1289*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store void (i8*, ...)* bitcast (void (%struct..kmp_privates.t*, i8***, i8***)* @.omp_task_privates_map. to void (i8*, ...)*), void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !13 1290*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP11]], i8** [[DOTTASK_T__ADDR_I]], align 8, !noalias !13 1291*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[TMP13]], i64* [[DOTLB__ADDR_I]], align 8, !noalias !13 1292*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[TMP15]], i64* [[DOTUB__ADDR_I]], align 8, !noalias !13 1293*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[TMP17]], i64* [[DOTST__ADDR_I]], align 8, !noalias !13 1294*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[TMP19]], i32* [[DOTLITER__ADDR_I]], align 4, !noalias !13 1295*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i8* [[TMP21]], i8** [[DOTREDUCTIONS__ADDR_I]], align 8, !noalias !13 1296*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.anon* [[TMP8]], %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !13 1297*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP22:%.*]] = load %struct.anon*, %struct.anon** [[__CONTEXT_ADDR_I]], align 8, !noalias !13 1298*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP23:%.*]] = getelementptr inbounds [[STRUCT_ANON:%.*]], %struct.anon* [[TMP22]], i32 0, i32 1 1299*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP24:%.*]] = load i64, i64* [[TMP23]], align 8 1300*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP25:%.*]] = load void (i8*, ...)*, void (i8*, ...)** [[DOTCOPY_FN__ADDR_I]], align 8, !noalias !13 1301*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP26:%.*]] = load i8*, i8** [[DOTPRIVATES__ADDR_I]], align 8, !noalias !13 1302*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP27:%.*]] = bitcast void (i8*, ...)* [[TMP25]] to void (i8*, i8***, i8***)* 1303*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void [[TMP27]](i8* [[TMP26]], i8*** [[DOTFIRSTPRIV_PTR_ADDR_I]], i8*** [[DOTFIRSTPRIV_PTR_ADDR1_I]]) #[[ATTR3]] 1304*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP28:%.*]] = load i8**, i8*** [[DOTFIRSTPRIV_PTR_ADDR_I]], align 8, !noalias !13 1305*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP29:%.*]] = load i8**, i8*** [[DOTFIRSTPRIV_PTR_ADDR1_I]], align 8, !noalias !13 1306*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[TMP22]], i32 0, i32 0 1307*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP31:%.*]] = load i32*, i32** [[TMP30]], align 8 1308*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP32:%.*]] = load i8*, i8** [[TMP28]], align 8 1309*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTGLOBAL_TID__ADDR_I]], align 4, !noalias !13 1310*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP34:%.*]] = bitcast i32* [[TMP31]] to i8* 1311*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP35:%.*]] = call i8* @__kmpc_task_reduction_get_th_data(i32 [[TMP33]], i8* [[TMP32]], i8* [[TMP34]]) #[[ATTR3]] 1312*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV_I:%.*]] = bitcast i8* [[TMP35]] to i32* 1313*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP36:%.*]] = getelementptr inbounds [[STRUCT_ANON]], %struct.anon* [[TMP22]], i32 0, i32 2 1314*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP37:%.*]] = load i16*, i16** [[TMP36]], align 8 1315*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP38:%.*]] = mul nuw i64 [[TMP24]], 2 1316*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP39:%.*]] = udiv exact i64 [[TMP38]], ptrtoint (i16* getelementptr (i16, i16* null, i32 1) to i64) 1317*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP40:%.*]] = call i8* @__kmpc_threadprivate_cached(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]], i8* bitcast (i64* @{{reduction_size[.].+[.]}}) #[[ATTR3]] 1318*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP41:%.*]] = bitcast i8* [[TMP40]] to i64* 1319*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i64 [[TMP39]], i64* [[TMP41]], align 8 1320*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP42:%.*]] = load i8*, i8** [[TMP29]], align 8 1321*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP43:%.*]] = bitcast i16* [[TMP37]] to i8* 1322*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP44:%.*]] = call i8* @__kmpc_task_reduction_get_th_data(i32 [[TMP33]], i8* [[TMP42]], i8* [[TMP43]]) #[[ATTR3]] 1323*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV2_I:%.*]] = bitcast i8* [[TMP44]] to i16* 1324*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP45:%.*]] = load i64, i64* [[DOTLB__ADDR_I]], align 8, !noalias !13 1325*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV3_I:%.*]] = trunc i64 [[TMP45]] to i32 1326*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[CONV3_I]], i32* [[DOTOMP_IV_I]], align 4, !noalias !13 1327*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND_I:%.*]] 1328*207b08a9SGiorgis Georgakoudis // CHECK2: omp.inner.for.cond.i: 1329*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP46:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !13 1330*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV4_I:%.*]] = sext i32 [[TMP46]] to i64 1331*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP47:%.*]] = load i64, i64* [[DOTUB__ADDR_I]], align 8, !noalias !13 1332*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CMP_I:%.*]] = icmp ule i64 [[CONV4_I]], [[TMP47]] 1333*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br i1 [[CMP_I]], label [[OMP_INNER_FOR_BODY_I:%.*]], label [[DOTOMP_OUTLINED__9_EXIT:%.*]] 1334*207b08a9SGiorgis Georgakoudis // CHECK2: omp.inner.for.body.i: 1335*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP48:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !13 1336*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[TMP48]], i32* [[I_I]], align 4, !noalias !13 1337*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP49:%.*]] = load i32, i32* [[CONV_I]], align 4 1338*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[IDXPROM_I:%.*]] = sext i32 [[TMP49]] to i64 1339*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ARRAYIDX_I:%.*]] = getelementptr inbounds i16, i16* [[CONV2_I]], i64 [[IDXPROM_I]] 1340*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP50:%.*]] = load i16, i16* [[ARRAYIDX_I]], align 2 1341*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[CONV5_I:%.*]] = sext i16 [[TMP50]] to i32 1342*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP51:%.*]] = load i32, i32* [[CONV_I]], align 4 1343*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ADD6_I:%.*]] = add nsw i32 [[TMP51]], [[CONV5_I]] 1344*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[ADD6_I]], i32* [[CONV_I]], align 4 1345*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP52:%.*]] = load i32, i32* [[DOTOMP_IV_I]], align 4, !noalias !13 1346*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[ADD7_I:%.*]] = add nsw i32 [[TMP52]], 1 1347*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 [[ADD7_I]], i32* [[DOTOMP_IV_I]], align 4, !noalias !13 1348*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND_I]] 1349*207b08a9SGiorgis Georgakoudis // CHECK2: .omp_outlined..9.exit: 1350*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret i32 0 1351*207b08a9SGiorgis Georgakoudis // 1352*207b08a9SGiorgis Georgakoudis // 1353*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZN1SC2Ev 1354*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1355*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1356*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1357*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1358*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1359*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0 1360*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store i32 0, i32* [[A]], align 4 1361*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1362*207b08a9SGiorgis Georgakoudis // 1363*207b08a9SGiorgis Georgakoudis // 1364*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZN1SD2Ev 1365*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1366*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1367*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1368*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1369*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1370*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1371*207b08a9SGiorgis Georgakoudis // 1372*207b08a9SGiorgis Georgakoudis // 1373*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZN1SC1ERKS_ 1374*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1375*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1376*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1377*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca %struct.S*, align 8 1378*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1379*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[TMP0]], %struct.S** [[DOTADDR]], align 8 1380*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1381*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[TMP1:%.*]] = load %struct.S*, %struct.S** [[DOTADDR]], align 8 1382*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: call void @_ZN1SC2ERKS_(%struct.S* nonnull dereferenceable(4) [[THIS1]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP1]]) 1383*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1384*207b08a9SGiorgis Georgakoudis // 1385*207b08a9SGiorgis Georgakoudis // 1386*207b08a9SGiorgis Georgakoudis // CHECK2-LABEL: define {{[^@]+}}@_ZN1SC2ERKS_ 1387*207b08a9SGiorgis Georgakoudis // CHECK2-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]], %struct.S* nonnull align 4 dereferenceable(4) [[TMP0:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1388*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: entry: 1389*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1390*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca %struct.S*, align 8 1391*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1392*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: store %struct.S* [[TMP0]], %struct.S** [[DOTADDR]], align 8 1393*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1394*207b08a9SGiorgis Georgakoudis // CHECK2-NEXT: ret void 1395*207b08a9SGiorgis Georgakoudis // 1396*207b08a9SGiorgis Georgakoudis // 1397*207b08a9SGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@main 1398*207b08a9SGiorgis Georgakoudis // CHECK3-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] { 1399*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: entry: 1400*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 1401*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4 1402*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8 1403*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[A:%.*]] = alloca i32, align 4 1404*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[B:%.*]] = alloca float, align 4 1405*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[C:%.*]] = alloca [5 x %struct.S], align 16 1406*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[SAVED_STACK:%.*]] = alloca i8*, align 8 1407*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8 1408*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[DOTTASK_RED_:%.*]] = alloca i8*, align 8 1409*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[DOTTASK_RED_1:%.*]] = alloca i8*, align 8 1410*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[I:%.*]] = alloca i32, align 4 1411*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i32 0, i32* [[RETVAL]], align 4 1412*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4 1413*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8 1414*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 1415*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 1416*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 1417*207b08a9SGiorgis Georgakoudis // CHECK3: arrayctor.loop: 1418*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %struct.S* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ] 1419*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: call void @_ZN1SC1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]]) 1420*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYCTOR_CUR]], i64 1 1421*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %struct.S* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 1422*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 1423*207b08a9SGiorgis Georgakoudis // CHECK3: arrayctor.cont: 1424*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP0:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 1425*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 1426*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP2:%.*]] = call i8* @llvm.stacksave() 1427*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i8* [[TMP2]], i8** [[SAVED_STACK]], align 8 1428*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[VLA:%.*]] = alloca i16, i64 [[TMP1]], align 16 1429*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i64 [[TMP1]], i64* [[__VLA_EXPR0]], align 8 1430*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i32 0, i32* [[I]], align 4 1431*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br label [[FOR_COND:%.*]] 1432*207b08a9SGiorgis Georgakoudis // CHECK3: for.cond: 1433*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP3:%.*]] = load i32, i32* [[I]], align 4 1434*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP3]], 5 1435*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 1436*207b08a9SGiorgis Georgakoudis // CHECK3: for.body: 1437*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP4:%.*]] = load i32, i32* [[A]], align 4 1438*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64 1439*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i16, i16* [[VLA]], i64 [[IDXPROM]] 1440*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP5:%.*]] = load i16, i16* [[ARRAYIDX]], align 2 1441*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[CONV:%.*]] = sext i16 [[TMP5]] to i32 1442*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4 1443*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP6]], [[CONV]] 1444*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i32 [[ADD]], i32* [[A]], align 4 1445*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br label [[FOR_INC:%.*]] 1446*207b08a9SGiorgis Georgakoudis // CHECK3: for.inc: 1447*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP7:%.*]] = load i32, i32* [[I]], align 4 1448*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[INC:%.*]] = add nsw i32 [[TMP7]], 1 1449*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i32 [[INC]], i32* [[I]], align 4 1450*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]] 1451*207b08a9SGiorgis Georgakoudis // CHECK3: for.end: 1452*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i32 0, i32* [[RETVAL]], align 4 1453*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP8:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8 1454*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: call void @llvm.stackrestore(i8* [[TMP8]]) 1455*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAY_BEGIN2:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 1456*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAY_BEGIN2]], i64 5 1457*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 1458*207b08a9SGiorgis Georgakoudis // CHECK3: arraydestroy.body: 1459*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP9]], [[FOR_END]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 1460*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 1461*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3:[0-9]+]] 1462*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %struct.S* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN2]] 1463*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE3:%.*]], label [[ARRAYDESTROY_BODY]] 1464*207b08a9SGiorgis Georgakoudis // CHECK3: arraydestroy.done3: 1465*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[TMP10:%.*]] = load i32, i32* [[RETVAL]], align 4 1466*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: ret i32 [[TMP10]] 1467*207b08a9SGiorgis Georgakoudis // 1468*207b08a9SGiorgis Georgakoudis // 1469*207b08a9SGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@_ZN1SC1Ev 1470*207b08a9SGiorgis Georgakoudis // CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 { 1471*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: entry: 1472*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1473*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1474*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1475*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: call void @_ZN1SC2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) 1476*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: ret void 1477*207b08a9SGiorgis Georgakoudis // 1478*207b08a9SGiorgis Georgakoudis // 1479*207b08a9SGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@_ZN1SD1Ev 1480*207b08a9SGiorgis Georgakoudis // CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1481*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: entry: 1482*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1483*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1484*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1485*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: call void @_ZN1SD2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) #[[ATTR3]] 1486*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: ret void 1487*207b08a9SGiorgis Georgakoudis // 1488*207b08a9SGiorgis Georgakoudis // 1489*207b08a9SGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@_ZN1SC2Ev 1490*207b08a9SGiorgis Georgakoudis // CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1491*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: entry: 1492*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1493*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1494*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1495*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0 1496*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store i32 0, i32* [[A]], align 4 1497*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: ret void 1498*207b08a9SGiorgis Georgakoudis // 1499*207b08a9SGiorgis Georgakoudis // 1500*207b08a9SGiorgis Georgakoudis // CHECK3-LABEL: define {{[^@]+}}@_ZN1SD2Ev 1501*207b08a9SGiorgis Georgakoudis // CHECK3-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1502*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: entry: 1503*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1504*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1505*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1506*207b08a9SGiorgis Georgakoudis // CHECK3-NEXT: ret void 1507*207b08a9SGiorgis Georgakoudis // 1508*207b08a9SGiorgis Georgakoudis // 1509*207b08a9SGiorgis Georgakoudis // CHECK4-LABEL: define {{[^@]+}}@main 1510*207b08a9SGiorgis Georgakoudis // CHECK4-SAME: (i32 [[ARGC:%.*]], i8** [[ARGV:%.*]]) #[[ATTR0:[0-9]+]] { 1511*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: entry: 1512*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 1513*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4 1514*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARGV_ADDR:%.*]] = alloca i8**, align 8 1515*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[A:%.*]] = alloca i32, align 4 1516*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[B:%.*]] = alloca float, align 4 1517*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[C:%.*]] = alloca [5 x %struct.S], align 16 1518*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[SAVED_STACK:%.*]] = alloca i8*, align 8 1519*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8 1520*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[DOTTASK_RED_:%.*]] = alloca i8*, align 8 1521*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[DOTTASK_RED_1:%.*]] = alloca i8*, align 8 1522*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[I:%.*]] = alloca i32, align 4 1523*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i32 0, i32* [[RETVAL]], align 4 1524*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i32 [[ARGC]], i32* [[ARGC_ADDR]], align 4 1525*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i8** [[ARGV]], i8*** [[ARGV_ADDR]], align 8 1526*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 1527*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[ARRAY_BEGIN]], i64 5 1528*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 1529*207b08a9SGiorgis Georgakoudis // CHECK4: arrayctor.loop: 1530*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %struct.S* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ] 1531*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: call void @_ZN1SC1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYCTOR_CUR]]) 1532*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYCTOR_CUR]], i64 1 1533*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %struct.S* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 1534*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 1535*207b08a9SGiorgis Georgakoudis // CHECK4: arrayctor.cont: 1536*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP0:%.*]] = load i32, i32* [[ARGC_ADDR]], align 4 1537*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 1538*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP2:%.*]] = call i8* @llvm.stacksave() 1539*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i8* [[TMP2]], i8** [[SAVED_STACK]], align 8 1540*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[VLA:%.*]] = alloca i16, i64 [[TMP1]], align 16 1541*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i64 [[TMP1]], i64* [[__VLA_EXPR0]], align 8 1542*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i32 0, i32* [[I]], align 4 1543*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br label [[FOR_COND:%.*]] 1544*207b08a9SGiorgis Georgakoudis // CHECK4: for.cond: 1545*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP3:%.*]] = load i32, i32* [[I]], align 4 1546*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP3]], 5 1547*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 1548*207b08a9SGiorgis Georgakoudis // CHECK4: for.body: 1549*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP4:%.*]] = load i32, i32* [[A]], align 4 1550*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64 1551*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i16, i16* [[VLA]], i64 [[IDXPROM]] 1552*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP5:%.*]] = load i16, i16* [[ARRAYIDX]], align 2 1553*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[CONV:%.*]] = sext i16 [[TMP5]] to i32 1554*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP6:%.*]] = load i32, i32* [[A]], align 4 1555*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP6]], [[CONV]] 1556*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i32 [[ADD]], i32* [[A]], align 4 1557*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br label [[FOR_INC:%.*]] 1558*207b08a9SGiorgis Georgakoudis // CHECK4: for.inc: 1559*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP7:%.*]] = load i32, i32* [[I]], align 4 1560*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[INC:%.*]] = add nsw i32 [[TMP7]], 1 1561*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i32 [[INC]], i32* [[I]], align 4 1562*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]] 1563*207b08a9SGiorgis Georgakoudis // CHECK4: for.end: 1564*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i32 0, i32* [[RETVAL]], align 4 1565*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP8:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8 1566*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: call void @llvm.stackrestore(i8* [[TMP8]]) 1567*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAY_BEGIN2:%.*]] = getelementptr inbounds [5 x %struct.S], [5 x %struct.S]* [[C]], i32 0, i32 0 1568*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAY_BEGIN2]], i64 5 1569*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br label [[ARRAYDESTROY_BODY:%.*]] 1570*207b08a9SGiorgis Georgakoudis // CHECK4: arraydestroy.body: 1571*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENTPAST:%.*]] = phi %struct.S* [ [[TMP9]], [[FOR_END]] ], [ [[ARRAYDESTROY_ELEMENT:%.*]], [[ARRAYDESTROY_BODY]] ] 1572*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds [[STRUCT_S]], %struct.S* [[ARRAYDESTROY_ELEMENTPAST]], i64 -1 1573*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: call void @_ZN1SD1Ev(%struct.S* nonnull dereferenceable(4) [[ARRAYDESTROY_ELEMENT]]) #[[ATTR3:[0-9]+]] 1574*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[ARRAYDESTROY_DONE:%.*]] = icmp eq %struct.S* [[ARRAYDESTROY_ELEMENT]], [[ARRAY_BEGIN2]] 1575*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: br i1 [[ARRAYDESTROY_DONE]], label [[ARRAYDESTROY_DONE3:%.*]], label [[ARRAYDESTROY_BODY]] 1576*207b08a9SGiorgis Georgakoudis // CHECK4: arraydestroy.done3: 1577*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[TMP10:%.*]] = load i32, i32* [[RETVAL]], align 4 1578*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: ret i32 [[TMP10]] 1579*207b08a9SGiorgis Georgakoudis // 1580*207b08a9SGiorgis Georgakoudis // 1581*207b08a9SGiorgis Georgakoudis // CHECK4-LABEL: define {{[^@]+}}@_ZN1SC1Ev 1582*207b08a9SGiorgis Georgakoudis // CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] align 2 { 1583*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: entry: 1584*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1585*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1586*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1587*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: call void @_ZN1SC2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) 1588*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: ret void 1589*207b08a9SGiorgis Georgakoudis // 1590*207b08a9SGiorgis Georgakoudis // 1591*207b08a9SGiorgis Georgakoudis // CHECK4-LABEL: define {{[^@]+}}@_ZN1SD1Ev 1592*207b08a9SGiorgis Georgakoudis // CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1593*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: entry: 1594*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1595*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1596*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1597*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: call void @_ZN1SD2Ev(%struct.S* nonnull dereferenceable(4) [[THIS1]]) #[[ATTR3]] 1598*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: ret void 1599*207b08a9SGiorgis Georgakoudis // 1600*207b08a9SGiorgis Georgakoudis // 1601*207b08a9SGiorgis Georgakoudis // CHECK4-LABEL: define {{[^@]+}}@_ZN1SC2Ev 1602*207b08a9SGiorgis Georgakoudis // CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1603*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: entry: 1604*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1605*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1606*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1607*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.S* [[THIS1]], i32 0, i32 0 1608*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store i32 0, i32* [[A]], align 4 1609*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: ret void 1610*207b08a9SGiorgis Georgakoudis // 1611*207b08a9SGiorgis Georgakoudis // 1612*207b08a9SGiorgis Georgakoudis // CHECK4-LABEL: define {{[^@]+}}@_ZN1SD2Ev 1613*207b08a9SGiorgis Georgakoudis // CHECK4-SAME: (%struct.S* nonnull dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] align 2 { 1614*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: entry: 1615*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS_ADDR:%.*]] = alloca %struct.S*, align 8 1616*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: store %struct.S* [[THIS]], %struct.S** [[THIS_ADDR]], align 8 1617*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: [[THIS1:%.*]] = load %struct.S*, %struct.S** [[THIS_ADDR]], align 8 1618*207b08a9SGiorgis Georgakoudis // CHECK4-NEXT: ret void 1619*207b08a9SGiorgis Georgakoudis // 1620